二叉树遍历题目,已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍因序列是多少,请详解(图解)
二叉树遍历题目,已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍因序列是多少,请详解(图解)详细介绍
本文目录一览: 某二叉树前序遍历法顺序是1,2,3,4,5,6,7,8,9 中序遍历法是4,3,5,2,1,7,6,8,9 请问后序遍历是?
答案:A:5 , 3 , 6 , 4 , 2 , 9 , 10 , 8 , 7 , 1,B:6 , 3 , 5 , 2 , 4 , 10 , 9 , 7 , 8 , 1,C:6 , 3 , 5 , 4 , 2 。
9 , 10 , 8 , 7 , 1,D:6 , 3 , 4 , 5 , 9 , 2 , 10 , 7 , 8 , 1,6 , 3 , 5 , 4 , 2 , 9 , 10 , 8。
前序遍历(VLR),[1]是二叉树遍历的一种,也叫做先根遍历、先序遍历、前序周游,可记做根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。
简介
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
若二叉树为空则结束返回,否则:
(1)访问根结点。
(2)前序遍历左子树。
(3)前序遍历右子树 。
需要注意的是:遍历左右子树时仍然采用前序遍历方法。
如图1所示二叉树
前序遍历结果:ABDECF
已知后序遍历和中序遍历,就能确定前序遍历。
二叉树遍历题
后序序列为gdbehfca
过程是首先还原二叉树,再求出后序遍历序列,过程如下:
首先从前序第一个得到根,回到中序来将其分割为左子树dgb、根a、右子树echf
再分别按照左右子树的结点回到各自的前序来再次求出左右子树的根,依然是回到刚才已经切分出左右子树的中序序列来分割
重复这个过程,就可以还原出二叉树了
问题的二叉树如下:
已知某二叉树的后序遍历是DACBE,中序遍历序列是DEBAC,则它的前序遍历序列是? 答案是EDBAC,为什么呢?
首先理解概念:
前序遍历:访问根结点的操作发生在遍历其左右子树之前。
中序遍历:访问根结点的操作发生在遍历其左右子树之中(间)。
后序遍历:访问根结点的操作发生在遍历其左右子树之后。
将其思想运用到你的题目就是:
1.由后序遍历是DACBE可知E为根
2.在中序遍历DEBAC中找到E的位置,可知D在左子树,BAC在右子树
3.再回到后序遍历观察BAC的相对位置可知B为根
4.再回到中序遍历找到B的位置,可知AC均在右子树
5.再回到后序遍历观察AC的相对位置可知C为根
6.再回到中序遍历找到C的位置,可知A在左子树
由此可画出树的结构,进而得知前序遍历为EDBAC
楼主可以此举一反三,祝学习进步。
先看后序,最后E>E为根节点
看中序的E,E前面的是E的左枝,E后面的是E的右枝
E的左枝只有D,E的右枝:后序ACB,中序BAC>B为父节点,B无左枝,右枝为C,C的左枝是A。
二叉树的遍历顺序:前序是【根,左,右】中序是【左,根,右】后序是【左,右,根】
后序遍历 跟 中序遍历 得出的原 二叉树 都不一样。你会不会写错啊?
由于后序遍历序列中排在最后的是E,说明E是根结点;又由于中序遍历序列中仅D排在E之前,其余的结点B、A、C相继排在E之后,说明D为根结点E的左子树,其余的结点B、A、C在根结点E的右子树上,结构如下图所示:
后序遍历序列中B排在E的前一位,说明B就是根结点E的右子树的根,即B是E的右孩子,再结合中序遍历序列,可以发现B没有左孩子,那么结点A、C均在结点B的右子树上,结构如下图所示:
后序遍历序列中A排在C的前一位,说明A是C的孩子,而中序遍历序列中A也排在C的前一位,可以进一步确定A是C的左孩子,这样的话,该二叉树完整的结构图应为:
那么,该二叉树的正确前序遍历序列应该为 EDBCA.
设有某二叉树,其前序遍历序列是ABCDEFGH,中序遍历序列是CBDAFGEH,试画出该二叉树
A(B(C.D)E(F.G(H)))
先看先序,其第一个为树的根,先序遍历是先根再左子树最后右子树,第一个肯定是树的根,先画A,A再中序遍历中左右都有,说明A有左子树也有右子树。
扩展资料:
按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排列为一个线性序列。在该序列中,除第一个结点外,每个结点有且仅有一个直接前驱结点;除最后一个结点外,每个结点有且仅有一个直接后继结点。
但是,二叉树中每个结点在这个序列中的直接前驱结点和直接后继结点是什么,二叉树的存储结构中并没有反映出来,只能在对二叉树遍历的动态过程中得到这些信息。
参考资料来源:百度百科-二叉树
利用先序遍历算法建立如图所示二叉树,并对二叉树进行先序遍历.
// 创建二叉树,输入先序遍历序列:ABC##DE#G##F###// 先序遍历输出节点:ABCDEGF// 作为对比参考:// 中序遍历输出节点:CBEGDFA// 后序遍历输出节点:CGEFDBA#include
#include
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("\n\n中序遍历输出节点: "); inOrder(root); printf("\n后序遍历输出节点: "); postOrder(root); printf("\n"); return 0;}
已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,试画出这棵二叉树,并写出后续遍历
左一定优先于右 ,所以根的位置有三种。
根 左 右、左 根 右、左 右 根。
分别称为先序遍历、中序遍历、后续遍历,子树也一样,到一个子树就遍历一次,按照遍历顺序写下去就好,尤其注意根特殊对待(只有一个所以只写一个)。
后续遍历是:CBEFDA
a
b d
c e f
已知二叉树后序遍历是dabec,中序遍历是debac,求该二叉树的先序遍历。(这种类型的题目又怎么
思路是:首先看后序遍历,后序遍历是先左再右最后根,所以后序遍历最后一个肯定是根结点。所以这里根结点是c,然后看一下c这个结点在中序中的问题,中序遍历是先左再最后右,所以中序序列中,c左边的为c的左子树这边,右边有右子树这边。这里中序debac,所以该树没有右子树,只有左子树。
然后针对c的左子树递归上述过程,构建完树。
下面是我的创建过程,首先确定了c
c
/ \
未知树 无
后序倒数第二个e,确定e未知树的根,然后看中序,d在e左边,ba在右边,d是左子树确定,ba还需要进一步判断
c
/
e
/ \
d 未知数
看后序倒数第三个b,所以未知树的根是b,确定b,然后看b中序中的位置,左边无,右边a,所以最终该二叉树如下
c
/
e
/ \
d b
\
a
最后根据该树核对一下后序和中序,没有问题,所以根据该树先序遍历是cedba
已知二叉树的先序遍历序列为ABCDEFG,中序遍历序列为AHIFCJGDEBD,其后序遍历序列为______
先序遍历序列为ABCFHIDGJE, 中序遍历序列为AHIFCJGDEB[先序]第1个字符是A,这是根节点,而[中序]第1个字符也是A,表明根节点A没有左子树,而只有右子树.[先序]第2个字符是B,表明B紧跟A的后面,是A的右分支,而[中序]的B排在末尾,表明B只有左子树,而没有右子树.[先序]第3个字符是C,表明C紧跟B的后面,是B的左分支,而[中序]的C的前面有"HIF",后面有"JGD...",预计C会有左子树,也应该有右子树.二叉树示意图: A \ B / C / \ F D / / \ H G E \ / I J后序遍历序列 I H F J G E D C B A// C语言测试代码// 测试结果:// 创建二叉树,输入先序扩展序列(#表示空结点):// A#BCFH#I###DGJ###E###// 先序遍历序列: A B C F H I D G J E// 中序遍历序列: A H I F C J G D E B// 后序遍历序列: I H F J G E D C B A#include
#include
typedef struct Node{ char data; struct Node* left; struct Node* right;}Node,*TreeNode;//创建二叉树: 先序扩展序列 + 递归法void CreateBiTree(TreeNode *pRoot){ char input; scanf("%c",&input); //输入数据 if(input == '#') //#是空结点 { *pRoot = NULL; } else { *pRoot=(TreeNode)malloc(sizeof(Node)); if(*pRoot == NULL) { printf("\n分配动态内存时出错.\n"); exit(1); } (*pRoot)->data=input; CreateBiTree(&((*pRoot)->left)); CreateBiTree(&((*pRoot)->right)); }}//先序遍历void PreOrder(TreeNode root){ if(root != NULL) { printf("%c ",root->data); PreOrder(root->left); PreOrder(root->right); }}//中序遍历void InOrder(TreeNode root){ if(root != NULL) { InOrder(root->left); printf("%c ",root->data); InOrder(root->right); }}//后序遍历void PostOrder(TreeNode root){ if(root != NULL) { PostOrder(root->left); PostOrder(root->right); printf("%c ",root->data); }}int main(){ TreeNode root; printf("创建二叉树,输入先序扩展序列(#表示空结点):\n"); CreateBiTree(&root); printf("先序遍历序列: "); PreOrder(root); printf("\n"); printf("中序遍历序列: "); InOrder(root); printf("\n"); printf("后序遍历序列: "); PostOrder(root); printf("\n"); return 0;}
已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍因序列是多少,请详解(图解)
cedba
方法很简单
dabec是后序遍历
则c是根节点
将中序遍历以c为中心分为两边
如此操作即可得到一棵树
(dabec),(debac)
((dabe)c),((deba)c)
(((dab)e)c),(((d)e(ba))c)
((((d)(a)b)e)c),(((d)e(b(a)))c)
这样就把树给构造了出来
前序遍因序列是cedba。
二又树的遍历有3种:前序、中序和后序。
①前序首先遍历访问根结点,然后按左右顺序遍历子结点。
②中序遍历首先访问左子树,然后访问根结点,最后遍历右子树。
③后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点。本题根据后序和中序遍历的结果可以得出二叉树的结构,然后再对其进行前序遍历。
二叉树
在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点。
深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。
一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。