一维数组模拟二叉树(无指针)

数组模拟二叉树

我找了好久都没找到用一维数组来模拟二叉树的,回心一想还是要靠自己qwq
算了,,步入正题

二叉树

二叉树嘛,就是只有两个儿子(左儿子和右儿子)
在数组模拟二叉树中,最最最重要的性质:
若父亲结点的编号为 x
1. 左儿子的编号为:2*x;
2. 右儿子的编号为:2*x+1;
是不是有点像树状数组
好了,有了这两条性质,我们就可以构造二叉树了

数组

123456
123456

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

欢迎大佬留言

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值