有关树的存储与二叉树的遍历
·
简介
很多像我一样的蒟蒻也已经明白树十分重要,所以树是必须要熟记的。
树的存储(无权)
树是个神奇的东西,因为它不确定指向几个数,所以用邻接表(vector)存储最合适。

如图,vector存储后为:
vector[1]="2 5 8";
vector[2]="3"
vector[3]="4";
vector[4]=""
vector[5]="6";
vector[6]=""
vector[7]="";
vector[8]="7 9"
vector[9]=" 10";
vector[10]=""
二叉树的存储代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> t[100];
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
int l,r;
cin>>l>>r;
if(l!=0) t[i].push_back(l);
if(r!=0) t[i].push_back(r);
}
for(int i=1;i<=n;i++){
if(t[i].size()>=1){
cout<<"子节点个数:"<<t[i].size();
if(t[i][0]!=0) cout<<" 左节点:"<<t[i][0];
if(t[i][0]==0) cout<<" 无左节点";
if(t[i][1]!=0) cout<<" 右节点:"<<t[i][1];
if(t[i][1]==0) cout<<" 无右节点";
}
if(t[i].size()==0) cout<<"为叶子结点";
cout<<endl;
}
return 0;
}
/*
in:
4
2 3
4 0
0 0
0 0
out:
子节点个数:2 左节点:2 右节点:3
子节点个数:1 左节点:4 无右节点
为叶子结点
为叶子结点
*/
二叉树的遍历
前序遍历为:根左右
中序遍历为:左根右
后序遍历为:左右根

如图:
前序遍历为:1 2 4 5 3 6
中序遍历为:4 2 5 1 6 3
后序遍历为:4 5 2 6 3 1
所以,题P1305 新二叉树 - 洛谷为前序遍历
代码见我:P1305 新二叉树—>vector与dfs和树-CSDN博客
我恩师hnjzsyjyj的:洛谷 P1305:新二叉树 ← DFS + 哈希表优化-CSDN博客
代码见下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
vector<int> t[1005];
bool st[maxn];//标记是否遍历
int x1[maxn];//标记遍历过的数
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++) {
st[i]=true;
}
for(int i=1; i<=n; i++) {
int l,r;
cin>>l>>r;
t[i].push_back(l);
t[i].push_back(r);
}
int j=0;
int x=1;
x1[j]=x;
while(st[t[1][0]]!=false||st[t[1][1]]!=false) {//把左与右全遍历一遍
if(st[t[x][0]]==false&&st[t[x][1]]==false) {
cout<<x<<" ";//为叶子结点时,可以输出
st[x]=false;//标记,也可以说是删除
while((st[t[x][0]]==false&&st[t[x][1]]==false)&&x!=1) {
x=x1[--j];//进行返回
}
} else {
for(int i=0; i<t[x].size(); i++) {
if(st[t[x][i]]!=false) {
x=t[x][i];
x1[++j]=x;
break;//寻找下一个数,先遍历左,后遍历右
}
}
}
}
cout<<1;//最后遍历根节点
return 0;
}
中序遍历:未完待续...
更多推荐
所有评论(0)