已知二叉树如有图所示
前序遍历BEFCGDH
中序遍历FEBGCHD
后序遍历FEGHDCB
#include #include #define MAX 50+3using namespace std;typedef char Elem_Type;typedef struct BiTree{ Elem_Type data;//数据 struct BiTree *Lchild;//左孩子 struct BiTree *Rchild;//右孩子}BiTree; //要查找的元素 查找的地方 数组的长度int Search_Num(Elem_Type num,Elem_Type *array,int len){ for(int i=0; idata = *back; int index = Search_Num(*back,center,len); temp->Rchild = Resume_BiTree(center+index+1,back-1,len-index-1); temp->Lchild = Resume_BiTree(center,back-len+index,index); return temp;}void PreOrderTraverse(BiTree *root)//前序遍历{ if( root != NULL) { coutdata; PreOrderTraverse(root->Lchild); PreOrderTraverse(root->Rchild); }}int main(void){ Elem_Type *inorder = new Elem_Type [MAX];//中序 Elem_Type *postorde = new Elem_Type [MAX];//后序 int t;cin>>t; while(t--) { cin>>inorder;cin>>postorde; BiTree *root = Resume_BiTree(inorder,postorde+strlen(postorde)-1,strlen(inorder)); PreOrderTraverse(root); cout<<endl; } return 0;}
我给你写了一个程序来还原了树。
第一个数据1是代表数据的测试个数,1代表只有一棵树要测试。
(1) 二叉链表储存图:
#A#
/ \
#B# ^C#
/ \ \
#D# ^E^ ^F#
/ \ \
^G^ #H# #I^
/ \ /
^J^ ^K^ ^M^
上图,符号#表示指针,符号^表示空结点.
(2) 先序遍历序列: A B D G H J K E C F I M
中序遍历序列: G D J H K B E A C F M I
后序遍历序列: G J K H D E B M I F C A
(3) 转换为森林:
A C F I
/ \ |
B E M
/ | \
D H K
| |
G J
上图,树C里的结点C是根结点,这个树就只有C这个结点.
树F里的结点F是根结点,这个树就只有F这个结点.
// C语言测试程序
// 创建二叉树,输入先序遍历序列: ABDG##HJ##K##E##C#F#IM###
// 先序遍历序列: ABDGHJKECFIM
// 中序遍历序列: GDJHKBEACFMI
// 后序遍历序列: GJKHDEBMIFCA
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
char data;
struct Node *lchild;
struct Node *rchild;
}Bitree;
//用"先序遍历"算法创建二叉树
void CreateBiTree(Bitree **bt)
{
char s;
scanf("%c",&s); //输入数据
if(s=='#') //'#'是空节点
*bt=NULL;
else
{
*bt=(Bitree *)malloc(sizeof(Bitree));
(*bt)->data=s;
CreateBiTree(&((*bt)->lchild));
CreateBiTree(&((*bt)->rchild));
}
}
//用"先序遍历"输出节点
void preOrder(Bitree *ptr)
{
if(ptr!=NULL)
{
printf("%c",ptr->data);
preOrder(ptr->lchild);
preOrder(ptr->rchild);
}
}
//用"中序遍历"输出节点
void inOrder(Bitree *ptr)
{
if(ptr!=NULL)
{
inOrder(ptr->lchild);
printf("%c",ptr->data);
inOrder(ptr->rchild);
}
}
//用"后序遍历"输出节点
void postOrder(Bitree *ptr)
{
if(ptr!=NULL)
{
postOrder(ptr->lchild);
postOrder(ptr->rchild);
printf("%c",ptr->data);
}
}
int main()
{
Bitree *root;
printf("创建二叉树,输入先序遍历序列:");
CreateBiTree(&root);
printf("先序遍历序列: ");
preOrder(root);
printf("
中序遍历序列: ");
inOrder(root);
printf("
后序遍历序列: ");
postOrder(root);
printf("
");
return 0;
}
数据结构二叉树排序,在纸上作答,最好有分析过程,我刚学到二叉树。如图...
用18代替掉24,然后然后删除18,18的左子树代替18的位置,当然这里没有。45 \/ \\ 18 53 \/ \\ 12 30 \/ \\ 6 16 另外,建议百度一下二叉排序树,查找一下相关的代码,包括建立 删除 插入,如下面的链接。http:\/\/www.cnblogs.com\/zhuyf87\/archive\/2012\/11\/09\/2763113.html ...
已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍因序 ...
【解析】依据后序遍历序列可确定根结点为c;再依据中序遍历序列可知其左子树由deba构成,右子树为空;又由左子树的后序遍历序列可知其根结点为e,由中序遍历序列可知其左子树为d,右子树由ba构成,如下图所示,求得该二叉树的前序遍历序列为选项A)。
数据结构之二叉树详解
图3.13所示二叉树访问如下:则3.13所示二叉树的前序遍历输出为: ABDHIEJCFG 3 中序遍历(左根右)中序遍历 就是从二叉树的根结点出发,当第二次到达结点时就输出结点数据,按照先向左在向右的方向访问。图3.13所示二叉树中序访问如下:则3.13所示二叉树的中序遍历输出为: HDIBJEAFCG 4...
有关二叉树的问题,如图所示:
不是的,因为题目已经说是树了,如是原本是二叉树,可以说是完全二叉树
试写出如图所示的二叉树分别按先序、中序、后序遍历时得到的结点序列...
前序的顺序: 根 -> 左 -> 右 中序的顺序: 左 -> 根 -> 右 后序的顺序: 左 -> 右 -> 根 先序:A,B,D,F,J,G,K,C,E,H,I,L,M 中序:J,F,D,K,G,B,A,H,E,L,I,M,C 后序:J,F,K,G,D,B,H,L,M,I,E,C,A ...
一个二叉树按顺序方式存储在一个一维数组中,如图:
二叉树按照层序遍历,依次编号,按照编号的顺序,存储在连续存储单元的方式就是二叉树的顺序存储。如果二叉树不是满二叉树,则只存储有内容的节点,缺失的结点在存储的过程中,所对应的位置不存储任何东西,即是空的。对于题中所给的存储结构,构造一个满二叉树,结点为空,再按照层序遍历,依次编号,在...
数据结构(二):二叉搜索树(Binary Search Tree)
【2】每一层只有一个节点的二叉树。如下图SP_BST所示:第【1】种情况下的查找次数分析:由上一章 二叉树 可知,完美二叉树中树的深度与节点个数的关系为: 。设深度为 的完全二叉树节点总数为 ,因为完全二叉树中深度为 的叶子节点层不一定填满,所以有 ,即: ,因为 为...
完全二叉树的定义
如图a)所示是一棵完全二叉树,图b)由于最后一层的节点没有按照从左向右分布,因此只能算作是普通的二叉树。完全二叉树除了具有普通二叉树的性质,它自身也具有一些独特的性质,比如说,n个结点的完全二叉树的深度为⌊log2n⌋+1。⌊log2n⌋表示取小于log2n的最大整数。
已知二叉树后序遍历序列是DBCEFGHA,中序遍历序列EDCBAHFG,它的前序...
c前边有d 后边有b 哪么可以确定dcb这棵树为 c \/\\ d b 哪么整棵树的左子树就确定了 为 e \\ c \/\\ d b 同理 右子树应为 h \\ g \/ f 则整棵树就出来了 为下图所示 得出整棵树 前序遍历自然不在话下 为aecdbhgf --- 晕了,想偷下懒都不行呵 同理就是要你自己照着刚才的方法...
捷杜氨酚:[答案] 先根 ABDEHICFKG 中根 DBHEIAFKCG 后根 DHIEBKFGCA 层次 ABDECHIFGK
合山市13896367394: 已知二叉树,如图所示,写出二叉树的先根,中根,后根次序遍历序列和层次遍历序列.谢谢!! - ?
捷杜氨酚: 很显然你还不懂的遍历一棵二叉树的原理 当你拿到一棵二叉树,无论它的形状如何的千奇百怪 我们都可以将它按照如下的方式划分 根 / \ 左子树 右子树 一棵有很多个节点的二叉树可以划分为以上的形式 也可以这么理解,只要是按以上形式组合...
合山市13896367394: 11.已知一颗二叉树如下图所示,试分别写出按中序、先序和后序遍历时所得到的结点序列.?
捷杜氨酚: 先序 a i d h b x p f r 中序 d i a x b p h f r 后序 d i x p h r f h a
合山市13896367394: 试写出如图所示的二叉树分别按先序、中序、后序遍历时得到的结点序列 - ?
捷杜氨酚: 前序的顺序: 根 -> 左 -> 右 中序的顺序: 左 -> 根 -> 右 后序的顺序: 左 -> 右 -> 根先序:A,B,D,F,J,G,K,C,E,H,I,L,M 中序:J,F,D,K,G,B,A,H,E,L,I,M,C 后序:J,F,K,G,D,B,H,L,M,I,E,C,A
合山市13896367394: 已知一棵二叉树的顺序存储结构如图所示 - ?
捷杜氨酚: 先根遍历ABCDEFGHIJK 后根遍历DECBHIGKJFA
合山市13896367394: 已知二叉树 求二叉树的前序 中序 后序遍历 怎么写 - ?
捷杜氨酚: 首先理解概念: 前序遍历:访问根结点的操作发生在遍历其左右子树之前. 中序遍历:访问根结点的操作发生在遍历其左右子树之中(间). 后序遍历:访问根结点的操作发生在遍历其左右子树之后. eg:后序遍历为DBCEFGHA,中序遍历为EDCBAHFG,求前序遍历(网上例子) 解:首先 看后序遍历DBCEFGHA,A为总根节点 然后 寻找中序遍历EDCBAHFG中A位置,则EDCB在A的左枝,HFG在A的右枝; 重复前两步,从后序遍历最后一位找,在中序遍历寻找对应点,得出左右分枝... 最后得到AECDBHGF,再自己验证即可...
合山市13896367394: 根据下图给出的二叉树,求出先序遍历、中序遍历和后序遍历的结点序列 a / \ b c / / d e \ f - ?
捷杜氨酚:[答案] 先序遍历abdcef 中序遍历dbaefc 后序遍历dbfeca 其实这种问题的解法很简单,你绕着二叉树从根节点左边画一条线绕过整个2叉树然后回到根节点,先序遍历就是线经过左边的时候的顺序,中序遍历就是线经过下面的时候的顺序,后续遍历就是经...
合山市13896367394: 给定二叉树如下图所示,编程完成下列要求 - ?
捷杜氨酚: 先序:ABDGEHCF 中序:DGBHEACF 后序:GDHEBAFC a(b(d(,g),e(h,)),c(,f))
合山市13896367394: 设有如下图所示的二叉树,对此二叉树前序遍历的结果为() - ?
捷杜氨酚: B,前序就是先看根节点,再看左子树,再看右子树
合山市13896367394: 已知二叉树的前序和中序结果,求后序 - ?
捷杜氨酚: 在前序中找到根节点,然后在中序中找到对应的节点,然后分成左右子树进行递归处理. 代码及示例运行结果如下: #include <stdio.h> #include <string.h>bool PostOrder0(char *preBegin, char *preEnd, char *inBegin, char *inEnd, char *post) ...