数组模拟二叉树

数组模拟二叉树

让人气愤的是:我找了好久都没找到用数组来模拟二叉树的,回心一想还是要靠自己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
#include
#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

欢迎大佬留言

你可能感兴趣的:(数据结构(树))