首页 > 编程知识 正文

先序遍历中序遍历求树,已知遍历序列求画树

时间:2023-05-05 00:29:38 阅读:154818 作者:1138

题目:

顺序扫描: abdce — a bd ce

中顺序扫描: dbaec — db a ec

可知根节点为a,左子为bd,右子为ce

优先顺序bd

中序bd

在二叉树中,位置b是父亲,d是右边的孩子。

优先顺序ce

中位次ec

位置e为左子,c为右子。

node*build(charpre_str (,char in_str[] ),int len ) /按前序遍历二叉树(//根据输入的前序遍历和中序遍历的结果,链表树nn //找到树根首先在中顺序扫描中出现的位置//首先在in_str中出现的pre_str[0]的位置if(pos0) p-lchild=build(pre_str1,in_str,pos ) (if ) poslen-1 ) p-rchild=build ) pre_strpos1,in_str pos 1,len - pos - 1 ); } return p; }树的代码总结

//以构成完全二叉树的顺序记忆结构//阶层数从左向右记忆,空的要素记忆符号# define maxsize 1000 typedefcharsqtree [ maxsize ]//属的要素类型为datatypevoidcreatbtree (sstyped char ch; ch=getchar (; 威尔(ch!='# ' ) {bt[i]=ch; I; ch=getchat (; }bt[i]='# '; //链存储结构typedef char datatype; typedef struct Bnode{char data; struct Bnode*Lchild,*Rchild; }Btnode,*BTptr; //节点,节点指针createlbtree(BtptrBt )//绘制树图像的()已知左子代和右子代) {datatype ch; //树节点值int i=0; BTptr p,q; //节点指针清除队列(q; //队列Bt=空; //节点初始化ch=getchar (; 威尔(ch!='# ' )//输入#作为结束树的标志{p=NULL; if(ch!='@ ' () ) /如果不等于虚拟节点,则链接到父节点下(/虚拟节点是完全二叉树的本来孩子,但为空。 此时,I且NULL不连锁)//流程p=NULL。 不进入本if,I,NULL。 I! 进入else p为空,没有链接。 //使用排队技术确保正确的链入{p=(Btptr ) malloc ) sizeof(Btnode ) }//申请新节点p-data=ch数据p-lchild=p-rchild //先初始化为空节点}i; //序列号计数enqueue(q,p ); //存在队列q,不满意在队列末尾插入p元素使其成为新元素//新节点地址入队或虚拟节点地址的空入队if(I==1)//有效节点从1开始({BT=p ) //第一个输入节点是根(}else //不是第一个) q=getqtop ) q; if(pq )//p和q都非空(if ) I%2==0) )//偶数为左子q-Lchild=p; else//奇数为右的子代从1到q-Rchild=p; (if ) I %2==1del queue (q ) q; 两个孩子离开了队伍。 Q-top; (}ch=getchar ); }返回(Bt ); //二叉树递归扫描//*为了使层次结构线性化,得到类似于线性表的序列并访问节点p,根据节点的datatype (数据类型)进行:链表L-data数组l ) I )队列L-data ) q-q (数据) 表示为visit(p(p )是因为函数需要通过数据类型和主题来补充((*///1 .前一遍历) voidpreorder ) Btptrt ) /根节点指针是t ) if ) t ) //之前是递归结束标志preorder(t-lchild ); //左Preorder(T-RChile ); //右}//按中顺序voidinorder(Btptrt ) if ) t ) inorder ) t-lchild ); //左visit(t; //前inorder(t-rchile ); //右}//后的voidpostorder(Btptrt ) if ) t ) postorder ) t-lchild ); postorder(t-rchild ); visit(t; (//二叉树BTptr creat ) ) ) {bitree *t; char ch; ch=getchar (; if(ch==' ' ) t=NULL; else{t=(Btptr* ) malloc ) sizeof ) Btnode ); t-data=ch; t-lchild=creat (; t-rchile=creat (; }return t; //求出二叉树的高度intdepth(Btptr*t ) ({int dep1,dep2; //递归左侧儿童高度和右侧儿童高度if(t==null )//已遍历({return 1; //深度加一(else(dep1=t-lchild ); dep2=t-rchild (; if(DEP1dep2)返回de P1 1; //记住加1,也要算上自己的else return dep2 1; }//二叉树镜像//即指向交换所有节点的左右子树voidchange(Btptrt )//参数头部的指针) {Btnode temp; if(t ) {temp=t-lchild; t-lchild=t-rchild; t-rchiled=temp; //自己的左子右子完成了change(t-rchild )的交换; 变更(t-lchild ); //数叶子节点数直到左右孩子都空了,将左边孩子的节点和右边孩子的节点相加后返回1; intleaf(Btptrt ) if ) t-rchild==nullt-lchild==null ) return 1; ELSEreturnleaf(t-rchild ) leaf (t-lchild ); (//复制二叉树复制节点的数值时,左边的子代,右边的子代。 返回//本质上是,直到左右的孩子空了为止,返回到该节点指针//本质上是为了创建新的树s而需要申请新的空间BTPTRcopy(BTPTRT )//t,将当前需要复制的节点指针({btptr s; //新节点s=(Btptr ) malloc ) sizeof ) Btnode ); if(t!=null(s-data=t-data; if(T-Lchild!=null(s-lchild=copy(t-lchild ); }elses-lchild=NULL; if(T-Rchild )!=null(s-rchild=copy(t-rchild ); }elses-rchild=NULL; }return s; }代码片段

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。