原文链接:https://www.cnblogs.com/zlspace/p/6831293.html
-
问题描述:设有n个节点的二叉树采用顺序存储结构存储在数组BT中,编写函数由该数组创建的二叉链式存储结构
-
思路:假定BT数组中顺序存储顺序为层次遍历的顺序
-
BT数组中的下标 与 二叉树节点按层次遍历编号 如图
即得到节点的值等于BT[K-1],k为节点编号,以及如下图根节点与左右子树的编号规律
则可以利用递归
递归一般分为三部分:
1.递归出口以及参数的容错处理
2.递归逻辑(在每一次调用做的事情)
3.递归调用
代码如下:
void CreateTree(BiTree *t,int i,char a[])
{
if(i>strlen(a)||a[i-1]=='0'){
*t=NULL;
}
else{
*t=(BiTNode*)malloc(sizeof(BiTNode));
*t->data=a[i-1];
CreateTree(&(*t)->lchild,2*i,a);
CreateTree(&(*t)->rchild,2*i+1,a);
}
}
来总结一下:
- 发现这个递归的时候,让我对递归突然有了一丝丝的灵感,既然是二叉树的这种递归,只需要考虑两个问题:一个是将左右子树分开(尤其是恢复的时候,不用想得太复杂),二是将根和左右孩子连接在一起。
- 所以递归的函数里边肯定只有两个递归函数(一般都是先左后右)。一个专心弄左,一个专心弄右。