由遍历序列构造二叉树
来源:互联网 发布:网络语大虾是什么意思 编辑:程序博客网 时间:2024/05/21 07:06
由二叉树的先序+中序、后序+中序、层次+中序都可以唯一的确定一棵二叉树。需要注意的是,如果只知道二叉树的先序序列和后序序列是无法唯一确定一棵二叉树的。
题意:输入某二叉树的先序遍历和中序遍历结果,请重建出该二叉树,并输出它的后序遍历序列。
解题思路:在二叉树的先序遍历中,第一个数字是根结点,在中序遍历中,根结点在序列的中间,左子树在根结点的左边,右子树在根结点的右边。因此可以通过扫描中序序列,找到根结点,可以得到左子树及其右子树的结点集,也即得到了左、右子树的先序遍历序列和中序遍历序列,利用递归的方法来完成。代码如下:
//由遍历序列构造二叉树//输入某二叉树的先序遍历和中序遍历的结果,请重建出该二叉树。//假设输入的先序遍历和终序遍历的结果中都不含重复的数字。<pre name="code" class="cpp">#include<iostream>using namespace std;typedef struct BiTreeNode{int data;BiTreeNode *lchild;BiTreeNode *rchild;}*BiTree;//函数声明BiTreeNode* Construct(int *preorder, int *inorder, int length);BiTreeNode* ConstructCore(int *startPreorder,int *endPreorder,int *startInorder,int *endInorder);void PostorderPrint(BiTreeNode *root);void main(){int p[]={1,2,4,7,3,5,6,8};int i[]={4,7,2,1,5,3,8,6};int *pre=p;//先序序列int *in=i;//中序序列int length=8;BiTreeNode *root=Construct(pre,in,length);cout<<"construct success!"<<endl;PostorderPrint(root);}//构建一颗二叉树//已知先序遍历序列preorder,中序遍历序列inorder,以及长度lengthBiTreeNode* Construct(int *preorder, int *inorder, int length){if(preorder==NULL || inorder==NULL || length<=0)return NULL;return ConstructCore(preorder,preorder+length-1,inorder,inorder+length-1);}//递归函数,构建一颗二叉树//参数分别为:startPreorder是先序遍历的始结点,endPreorder是先序遍历的尾结点//startInorder是中序遍历的始结点,endInorder是中序遍历的尾结点BiTreeNode* ConstructCore(int *startPreorder,int *endPreorder,int *startInorder,int *endInorder){//先序遍历的第一个数字是根结点,首先构造根结点BiTreeNode *root=new BiTreeNode();root->data=*startPreorder;root->lchild=NULL;root->rchild=NULL;//递归终止条件:先序遍历中只有一个结点if(startPreorder==endPreorder)return root;//在中序遍历中找到根结点int *rootInorder=startInorder;while(rootInorder<=endInorder&&(*rootInorder)!=root->data)rootInorder++;if(*rootInorder!=root->data)//非法输入!exit(0);int leftlength=rootInorder-startInorder;//左子树的结点数if(leftlength>0)//左子树不为空,构造左子树root->lchild=ConstructCore(startPreorder+1,startPreorder+leftlength,startInorder,rootInorder-1);int rightlength=endInorder-rootInorder;//右子树的结点数if(rightlength>0)//右子树不为空,构造右子树root->rchild=ConstructCore(endPreorder-rightlength+1,endPreorder,rootInorder+1,endInorder);return root;}//以后序序列输出void PostorderPrint(BiTreeNode *root){if(root==NULL)return;PostorderPrint(root->lchild);PostorderPrint(root->rchild);cout<<root->data<<" ";}
0 0
- 由遍历序列构造二叉树
- 由遍历序列构造二叉树
- 由遍历序列构造二叉树
- 由遍历序列构造二叉树
- 上机作业之树:二叉树遍历算法、由遍历序列构造二叉树算法
- 由中序遍历序列和后序遍历序列构造二叉树(递归实现)
- 由遍历序列得到二叉树
- 由遍历序列还原二叉树结构
- 由初始序列构造二叉搜索树,输出层次遍历,并判断是否是完全二叉树
- 由二叉树的遍历序列恢复二叉树
- 由二叉树的前序遍历序列和中序遍历序列求后序遍历序列
- 由已知的层次遍历序列构建二叉树
- 由先序遍历和中序遍历构造二叉树的二叉链表代码
- 由二叉树的两个遍历序列求另一个遍历序列
- 由前序遍历序列和中序遍历序列重建二叉树
- 由中序遍历序列和后续遍历序列恢复二叉树
- 由先序序列/后序序列和中序序列构造二叉树
- 根据中序和层次遍历序列,构造二叉树
- 集合-Arraylist和LinkedList的区别
- unity3d 第二十天
- 看完《机器学习》的总结与心得
- IntentFilter的匹配规则
- Shadow Mapping
- 由遍历序列构造二叉树
- PAT-A 1092. To Buy or Not to Buy
- springboot处理session时间周期
- 关于一条sql语句中子查询的返回值不止一个,且拼接成相关规则的字符串
- c++中malloc,free,new,delete区别和联系
- PAT-A 1093. Count PAT's
- HDU 3460 字典树
- 请问.bash_profile文件在linux的哪里
- Openstack Paste.ini 文件详解