为了账号安全,请及时绑定邮箱和手机立即绑定

不知道为什么在运行的时候就内存出错了~有高手来指点下吗?谢谢~

不知道为什么在运行的时候就内存出错了~有高手来指点下吗?谢谢~

素胚勾勒不出你 2022-06-17 11:11:47
template <class T>void BiTree<T>::Creat(BiNode<T> * root,int i1,int i2,int k){//root为当前根结点,i1,i2分别为前序和中序序列的起始下标,k为序列长度int m=0,llen=0,rlen=0;if(k<=0)root=NULL;//建立空树else{root=new BiNode<T>;root->data=pre[i1]; //根结点为前序序列中的起始结点m=Find(pre[i1],pin,i2);//从中序序列pin的i2开始,查找值为pre[i1]的位置llen=m-i2; //求左子树的长度rlen=k-(llen+1); //求右子树的长度,由于下标从i2开始,因此llen要+1Creat(root->lchild,i1+1,i2,llen); //递归建立左子树Creat(root->rchild,i1+llen+1,m+1,rlen);//递归建立右子树}}构造函数如下:template <class T> //有参构造函数,通过前序和中序序列建立二叉树BiTree<T>:: BiTree(int i1,int i2,int k){Creat(this->root,i1,i2,k);}
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

二叉树的遍历是指按照一定次序访问树中所有结点,并且每个节点仅被访问一次的过程。
1、先序遍历(前序)
(1)访问根节点;
(2)先序遍历左子树;
(3)先序遍历右子树。
2、中序遍历
(1)中序遍历左子树;
(2)访问根节点;
(3)中序遍历右子树。
3、后序遍历
(1)后序遍历左子树;
(2)后序遍历右子树‘
(3)访问根节点。
记住访问根结点的时机就可以区分三种遍历方法了。

同时知道一棵二叉树的先序序列和中序序列,或者同时知道中序序列和后序序列,就能确定这棵二叉树的结构。构造算法相信你已经学习过,在任一本介绍数据结构的书上应该也有描述的。由于涉及到算法细节,这里就不细说了。
下面根据你例子中给出的序列来介绍确定二叉树结构的步骤:
(1)后序序列中最后一个为树的根节点,即c为二叉树的根结点;
(2)中序遍历中根节点把序列分为左右子树的中序遍历序列两个部分,在你的例子在右子树没有中序遍历序列(中序遍历序列中c右边没有序列),故可知二叉树的左子树的后序遍历序列为dabe,中序遍历序列为deba;
(3)应用(1)的方法,确定c的左子树的根结点为e,并把以e为根结点的子树的中序遍历序列划分为d(以e为根结点的左子树的中序遍历序列)和ba(以e为根结点的右子树的中序遍历序列)两个部分,后序遍历序列为dab;
(4)应用(1)的方法,可确定e的左结点为b;
(5)应用(1)的方法,可确定e的右结点为a;
(6)最后,可确定a无左结点,右结点为d。
构造的二叉树如图中所示。
那么可获得前序遍历序列为cedba



查看完整回答
反对 回复 2022-06-20
  • 1 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信