二叉树的储存和遍历
本文总阅读量次
情形1:输入不按层次遍历的普通二叉树
struct node{
int data,l,r; //l左孩子位置 r右孩子位置
}tree[MAXN]; //MAXN表示节点个数
拆成数组:
int data[MAXN],l[MAXN],r[MAXN];
情形2:输入按层次遍历给出完全二叉树
int tree[MAXN],n;
...
cin>>n;
for(int i = 1; i <= n; i++)
cin>>tree[i];
只有按层次遍历的顺序给出完全二叉树或满二叉树可以用一维数组直接保存。
- 对节点
而言,左孩子 ,右孩子 - 对节点
而言,它的父亲就是
情形1的中序遍历
void dfs(int x) //x表示节点编号(位置),也是子树的根
{
if(tree[x].l) dfs(tree[x].l);
cout<<x<<" ";
if(tree[x].r) dfs(tree[x].r);
}
前序遍历和后序遍历只要调整访问根的顺序即可。
情形2的中序遍历
void dfs(int x) //x表示节点编号(位置),也是子树的根
{
if(2*x<=n) dfs(2*x);
cout<<tree[x]<<" ";
if(2*x+1<=n) dfs(2*x+1);
}
课后习题
1828-求后序遍历
1835-查找二叉树
1837- 二叉树遍历1
1836-对称二叉树
1829-扩展二叉树
1838-满二叉树
1832-二叉树遍历2