数组模拟二叉树
我找了好久都没找到用一维数组来模拟二叉树的,回心一想还是要靠自己qwq
算了,,步入正题
二叉树
二叉树嘛,就是只有两个儿子(左儿子和右儿子)
在数组模拟二叉树中,最最最重要的性质:
若父亲结点的编号为 x
1. 左儿子的编号为:2*x;
2. 右儿子的编号为:2*x+1;
是不是有点像树状数组
好了,有了这两条性质,我们就可以构造二叉树了
数组
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 |
emm 然后呢???
这就是数组啊!!!
不过,
我们可以当做一棵树啊
emm,how to do it?
1
2 3
4 5 6 7
当然要用特殊数据,不然翻车怎么办
其他的例子就自己动手吧qwq,我也没办法
像不像一棵树??
好了,思路大概就是这样:
利用二叉树的性质,然后控制结点进行建树
结点位置的话单独用一个数组来存储
那我们来看代码
我总算明白了茅塞顿开的意思
/*
输入一个整数n(n <= 100000),
表示二叉树中结点个数,编号为1~n。
约定1号结点为二叉树的根节点。
然后输入n行,每行包括两个整数,第i行表示编号为i的结点的左子节点和右子节点的编号。
如果某个结点没有左子节点,那么对应输行的第一个整数为0;
如果某个结点没有右子节点,那么对应行的第二个整数为0。
样例:
5
2 5
3 4
0 0
0 0
0 0
*/
#include<cstdio>
#include<iostream>
#define Maxn 100010
using namespace std;
int tree[4*Maxn],der[Maxn];
void work(int x){
if(tree[x]) printf("%d\n",tree[x]);
if(tree[2*x]) work(2*x);
if(tree[2*x+1]) work(2*x+1);
}
int main(){
int n,l,r;
scanf("%d",&n);
tree[1]=1;
der[1]=1;
for(int i=1;i<=n;i++){
scanf("%d%d",&l,&r);
tree[der[i]*2]=l;
tree[der[i]*2+1]=r;
der[l]=der[i]*2;
der[r]=der[i]*2+1;
}
work(1);
return 0;
}
就是这样的;
写了好几天qwq
欢迎大佬留言