‘壹’ 知道二叉树两种遍历 求第三种遍历 该用什么方法
由先序序列可以确定该二叉树根为A,因为先序遍历的顺序是从根到左子树再到右子树,然后从中序序列中,可以得知DBE在A的左子树,而FCG在A的右子树,
由于在先序序列中B紧跟在A后,所以B肯定是A左子树的树根,再看中序序列里,A的左子树是DBE,由中序序列遍历的顺序为:左子树,双亲,右子树,可知D为B的左子树,E为B的右子树,
同样可以分析树根A的右子树,先序序列中ABDE已经将树根和左子树遍历完成,所以剩下的CFG是右子树的先序遍历序列,可知C为右子树的树根,F为C的左子树,G为C的右子树,所以
该二叉树按层序遍历的顺序应该是ABCDEFG。
‘贰’ 如何根据后序遍历和中序遍历建立二叉树
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 100
typedef char ElemType;
//声明二叉树结构体
typedef struct node
{
ElemType data;
struct node *lchild,*rchild;
}BitTree;
BitTree *createBinTreeByPostIn(char *post,char *in,int number)
{
if(number==0) return NULL;
char c = post[number-1];
int i = 0;
while(in[i]!=c && i < number)i++;
int leftNumber = i;
int rightNumber = number - i - 1;
BitTree *node = (BitTree *)malloc(sizeof(BitTree));
node->data = c;
node->lchild = createBinTreeByPostIn(&post[0],&in[0],leftNumber);
node->rchild = createBinTreeByPostIn(&post[leftNumber],&in[i+1],rightNumber);
return node;
}
void PreOrder(BitTree *bt)
{
if(bt!=NULL)
{
printf("%c ",bt->data);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
int main(int argc,char **argv)
{
char a[SIZE],b[SIZE];
BitTree *p;
while(scanf("%s%s",a,b)!=EOF)
{
p = createBinTreeByPostIn(a,b,strlen(a));
PreOrder(p);
printf("
");
}
return 0;
}

(2)如何根据两种遍历方法判断二叉树扩展阅读:
注意事项
一、中序遍历(LDR)
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树。即:
若二叉树为空则结束返回,否则:
1、中序遍历左子树
2、访问根结点
3、中序遍历右子树。
注意的是:遍历左右子树时仍然采用中序遍历方法。
二、后序遍历(LRD)后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点。在遍历左、右子树时,仍然先遍历左子树,再遍历右子树,最后访问根结点。即:
若二叉树为空则结束返回,否则:
1、后序遍历左子树。
2、后序遍历右子树。
3、访问根结点。
注意的是:遍历左右子树时仍然采用后序遍历方法。
‘叁’ 怎样根据先序和后序遍历确定二叉树
根据二叉树遍历公式:
前序遍历:根—左—右
后续遍历:左—右—根
首先确定根,依次再确定各个结点!
‘肆’ 二叉树,如何从两种遍历的结果推出另一种遍历方法简单详细一点。注意不是编程求解
这个问题呢其实很简单,去年考试我们就考到了
1.中序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)访问根结点;
(3)遍历右子树。
2.先序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
(1) 访问根结点;
(2) 遍历左子树;
(3) 遍历右子树。
3.后序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)遍历右子树;
(3)访问根结点。
比如你知道一个程序的先序遍历是ABCDEFG 中序遍历是CBDAEGF让你推算出后序遍历
因为先序遍历的顺序是根-左-右 那么我们看先序遍历ABCDEFG,那么A就是根
再看中序遍历CBDAEGF,根据中序遍历的左-根-右 看出A左边CBD的都是左子树,右边的EGF是左子树
然后对先序遍历划分 A/BCD/EFG
对左子树CBD 由先序遍历中的A/BCD/EFG可以看出BCD中B在前面 则B是左子树的根 C是下一行的左子树
同理可对EFG分析
那么画出图 A
/ \
B E
/\ \
C D F
/
G
那么后序遍历CDBGFEA
我当初也学了一段时间,比较绕是吧
我在这写了半天 不知道你能看懂不
不行的加我Q
‘伍’ 怎么根据二叉树的两个遍历算出另一个遍历,有什么技巧
用递归法可画出二叉树图然后看图写出你要的遍历哈,下面我给你讲下哈(好理解的):
假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道。
PreOrder: GDAFEMHZ
InOrder: ADEFGHMZ
PostOrder: AEFDHZMG
现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢看比如,已知一棵树的前序遍历是地GDAFEMHZ地,而中序遍历是地ADEFGHMZ地应该如何求后续遍历?
第一步,root最简单,前序遍历的第一节点G就是root。
第二步,继续观察前序遍历GDAFEMHZ,除了知道G是root,剩下的节点必然是root的左右子树之外,没法找到更多信息了。
第三步,那就观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。
第四步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。
第五步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的右子树的第一个节点就是右子树的根节点。
如何知道哪里是前序遍历中的左子树和右子树的分界线呢看通过中序遍历去数节点的个数。
在上一次中序遍历中,root左侧是A、D、E、F,所以有4个节点位于root左侧。那么在前序遍历中,必然是第1个是G,第2到第5个由A、D、E、F过程,第6个就是root的右子树的根节点了,是M。
第六步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。
第七步,其实,如果仅仅要求写后续遍历,甚至不要专门占用空间保存还原后的树。只需要稍微改动第六步,就能实现要求。仅需要把第六步的递归的过程改动为如下:
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
我上面给你找出了一部分,你只要重复我上面的方法就可以找出其他的,加油,慢慢体会,你行的,不清楚再问我。
‘陆’ 如何根据前序遍历序列和中序遍历序列确定二叉树
前序遍历:1 2 4 8 9 10 11 5 3 6 7 (规律:根在前;子树在根后且左子树比右子树靠前); 中序遍历:8 4 10 9 11 2 5 1 6 3 7 (规律:根在中;左子树在跟左边,右子树在根右边); 后序遍历:8 10 11 9 4 5 2 6 7 3 1 (规律:根在后;子树在根前且左...
‘柒’ 怎样通过二叉树的遍历来确定一棵树
索路径:
先根(次序)遍历:
若树不空,则先访问根结点,然后依次先根遍历各棵子树。
后根(次序)遍历:
若树不空,则先依次后根遍历各棵子树,然后访问根结点。
按层次遍历:
若树不空,则自上而下自左至右访问树中每个结点。
森林的遍历
先序遍历(对森林中的每一棵树进行先根遍历)
若森林不空,则
访问森林中第一棵树的根结点;
先序遍历森林中第一棵树的子树森林;
先序遍历森林中(除第一棵树之外)其余树构成的森林。
中序遍历(对森林中的每一棵树进行后根遍历)
若森林不空,则
中序遍历森林中第一棵树的子树森林;
访问森林中第一棵树的根结点;
中序遍历森林中(除第一棵树之外)其余树构成的森林。
另外,虚机团上产品团购,超级便宜
‘捌’ 知道二叉树遍历怎样画出二叉树
由两种遍历所得的顺序能唯一确定一棵二叉树,比如给定了一颗二叉树的先序序列是:ABDECFG,中序序列是:DBEAFCG,由先序序列可以确定该二叉树根为A,因为先序遍历的顺序是从根到左子树再到右子树,然后从中序序列中,可以得知DBE在A的左子树,而FCG在A的右子树,由于在先序序列中B紧跟在A后,所以B肯定是A左子树的树根,再看中序序列里,A的左子树是DBE,由中序序列遍历的顺序为:左子树,双亲,右子树,可知D为B的左子树,E为B的右子树,同样可以分析树根A的右子树,先序序列中ABDE已经将树根和左子树遍历完成,所以剩下的CFG是右子树的先序遍历序列,可知C为右子树的树根,F为C的左子树,G为C的右子树,所以该二叉树按层序遍历的顺序应该是ABCDEFG。
‘玖’ 如何根据后序遍历和中序遍历建立二叉树
这里的“先根”也叫做先序,“中”和“后”也一样。
先序遍历是先访问当前节点,然后再遍历左子树,最后是右子树。
中序遍历是先遍历左子树,再访问当前节点,最后是右子树。
后序遍历是先遍历左子树,再遍历右子树,最后访问当前节点。
例:
一棵二叉树的先根遍历为abcdefg,中根遍历为cbdeagf,则其后根遍历为
:
1、先序遍历的第一个当前节点一定是根节点,所以a是根
2、由于中序遍历是先遍历完左子树再访问当前节点,所以可以看出中序序列在a之前的都是a的左子树中的节点,而在a之后是a的右子树的节点。
3、这样就分成了(cbde)a
(gf),三个集合。
4、我们分别再看各个集合。cbde集合中最先在先序序列中出现的是b,这说明b在这个集合中应该是第一个出现的。所以右可以再分
********a
**b********(gf)
c**(de)
5、再看de,在先序序列中因为d在e前方,所以d肯定是e的父节点,现在剩下的就是判断e是d的左孩子还是右孩子。从中序序列中看,d仍然是在e的前方,说明e是d的右孩子。
********a
**b********(gf)
c***d
******e
6、最后剩下gf.和de相似的判断方法,在先序序列中f在g前方,说明f是父节点,而在中序当中g在f前方,说明g是f的左孩子。
所以这颗二叉树应该是
********a
**b********f
c***d*****g
******e
7、二叉树出来了,后序的原理最上方讲了,剩下的就好办了。先左孩子,然后右孩子,最后当前节点。
8、当前节点为a时由于左右两个子树还没有访问所以要先访问完左右子树才能访问a.
9、b同a
10、c没有左右孩子,所以它是第一个。
11、c访问完了在访问b的右子树。
12、先访问d的孩子e,然后再是d。
13、b的左右孩子都访问完了,所以下一个是b。
14、访问完b,a的左子树访问完了,但是还是不能访问a,因为a的右子树还没有访问。
15、a的右子树中,g是f的孩子,所以先g再f。
16、最后是根节点a。