二叉树的构建

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


#include <stdio.h>#include <stdlib.h>
#define NUM 5
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;}


以上是关于二叉树的构建的主要内容,如果未能解决你的问题,请参考以下文章

二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串

二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串

二叉树oj ----> 二叉树的构建及遍历

java实现二叉树的构建以及3种遍历方法(转)

java实现二叉树的构建以及3种遍历方法

LeetCode根据二叉树创建字符串&&二叉树的构建以及遍历(递归)