二叉树的构建
Posted HelloCoding08
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的构建相关的知识,希望对你有一定的参考价值。
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
后序遍历为[9, 15, 7, 20, 3]
解题思路
3, 9, 20, 15, 7
9, 3, 15, 20, 7
得出结论:3是树根,3有左子树和右子树,左子树有9结点,右子树有20, 15, 17结点。所以3的左子树是3
20, 15, 7
15, 20, 7
得出结论:20是树根,20有左子树和右子树,左子树有15结点,右子树有 17结点。所以3的右子树是20,20的左节点15, 右节点是7
typedef int ElemType;
typedef struct node Node;
typedef struct node* Tree;
struct node {
ElemType elem;
Node* lchild;
Node* rchild;
};
int search_root_index(int target, int* in, int size){
int index;
for(index = 0; index < size; index++){
if(target == in[index]){
return index;
}
}
return -1;
}
Tree construct (int* pre, int* in, int length){
if(length < 1){
return NULL;
}
//把树的根节点的值为pre[0]
Tree tree = (Tree)malloc(sizeof(Node));
tree->elem = pre[0];
tree->lchild = NULL;
tree->rchild = NULL;
//在中序遍历的找到根节点的索引
int index = search_root_index(pre[0], in, length);
//根的左节点也是一个树
tree->lchild = construct(pre+1, in, index);
//根的右节点也是一个树
tree->rchild = construct(pre+index+1, in+index+1, length-index-1);
return tree;
}
void post (Tree tree){
if(tree == NULL){
return;
}
post(tree->lchild);
post(tree->rchild);
printf("%d\t", tree->elem);
}
int main () {
int length = NUM;
//int pre[] = {1, 2, 4, 7, 3, 5, 6, 8};
//int in[] = {4, 7, 2, 1, 5, 3, 8, 6};
int pre[] = {3, 9, 20, 15, 7};
int in[] = {9, 3, 15, 20, 7};
Tree root = construct(pre, in, length);
post(root);
printf("\n");
return 0;
}
以上是关于二叉树的构建的主要内容,如果未能解决你的问题,请参考以下文章
二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串