根据前序遍历和中序遍历创建二叉树
题目要求如下:
给定某一个二叉树的前序遍历和中序遍历,要求据此创建一颗符合这样遍历顺序的二叉树。
前序遍历和中序遍历的概念以及特性:
- 前序遍历:先遍历节点本身,再遍历其左孩子,最后遍历其右孩子。
- 中序遍历:先遍历其左孩子,再遍历节点本身,最后遍历其右孩子。
我们根据这样的概念可以得出其特性: - 一棵树的前序遍历的第一个节点一定是这棵树的根节点
- 一棵树的中序遍历中,在根节点前面遍历的节点构成根节点的左子树;在根节点后面遍历的节点构成根节点的右子树。
由这样的两个特性,我们可以先由一棵树的前序遍历来获得这棵树的根节点,然后通过根节点与其中序遍历来分别得到其左右子树的节点数目。
然后再根据左右子树的节点数目信息,我们可以从原先的根节点的前序遍历和中序遍历中截取出左右子树的前序遍历和中序遍历,之后这显然可以构成一个递归拆分问题,我们再将问题拆分成求解左右子树的根节点,将左右子树的根节点创建到根节点的左右孩子上,然后以此类推递归求解,最终可以构建出整颗二叉树。
c语言的代码实现:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10000
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
if(preorderSize==0||inorderSize==0) return NULL;
if(preorder==NULL||inorder==NULL) return NULL;
struct TreeNode *t=(struct TreeNode*)calloc(1,sizeof(struct TreeNode));
//memset(t,0,sizeof(struct TreeNode));
int root=preorder[0];
int left_num=0,right_num=0,i=0,j=0,k=0;
while(inorder[i]!=root)
{
left_num++;
i++;
}
right_num=preorderSize-1-left_num;
t->val=root;
t->left=buildTree(preorder+1,left_num,inorder,left_num);
t->right=buildTree(preorder+1+left_num,right_num,inorder+1+left_num,right_num);
return t;
}
LevelOrder(struct TreeNode *t)
{
if(t==NULL) return 0;
struct TreeNode *queue[MAXSIZE];
struct TreeNode *temp=NULL;
int rear=0,front=0;
queue[rear++]=t;
while(rear!=front)
{
temp=queue[front];
printf("%d ",temp->val);
if(temp->left!=NULL)
{
queue[rear++]=temp->left;
}
if(temp->right!=NULL)
{
queue[rear++]=temp->right;
}
front++;
}
}
main()
{
int size=5;
int preorder[5]={3,9,20,15,7};
int inorder[5]={9,3,15,20,7};
struct TreeNode *t=buildTree(preorder,size,inorder,size);
LevelOrder(t);
}
版权声明:本文为weixin_45863060原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。