关于二叉树的递归遍历还是不理解 那位高手能不能详细讲一下!!!
真正实用编程中,也没有必要太计较。
按照二叉树后序遍历的定义,无论是访问整颗树还是其子树均应该遵循选访问根结点的左子树,然后访问根结点的右子树,最后访问根结点的规律。因此对于一棵树(子树)t ,如果 t 非空,首先应该进入t的左子树访问,此时由于t的右子树及根结点尚未访问,因此必须将t保存起来,放入栈中,以便访问完左子树后,从栈中取出t,进行其右子树及根结点的访问。这里值得注意的是,当一个元素位于栈顶即将处理时,其左子树的访问一定已经完成,如果其右子树尚未遍历,接下来应该进入其右子树的访问,而此时该栈顶元素是不能出栈的,因为其根结点还未被访问;只有等到其右子树也访问完成后,该栈顶元素才能出栈,并输其根结点的值。因此,在二叉树后序遍历的过程中,必须使用seq.stack类型中的数组tag,其每个元素取值为0或1,用于标识栈中每个元素的状态。当一个元素刚进栈时,其对应的tag值置0;当它第一次位于栈顶即将被处理时,其tag值为0,意味着应该访问其右子树,于是将其右子树作为当前处理的对象,此时该栈顶元素仍应该保留在栈中,并将其对应的tag值改为1;当其右子树访问完成后,该元素又一次位于栈顶,而此时其tag值为1,意味着应该访问其根结点,并将其出栈。在整个二叉树后序遍历的过程中,程序要做的工作始终分成两个部分:当前正在处理的树(子树)和保存在栈中待处理的部分。只有这两部分的工作均完成后,程序方能结束。
(以上存手工输入)
先序遍历:就是先访问根节点,再访问其左子树。最后访问右子树。
A
/ \
B C
/ \ / \
D E F G
对于遍历来说无论是哪种遍历,采取的思路是遍历左子树和右子树的时候,把左子树和右子树当成一棵新的完整的二叉树来对待,按照指定的遍历方法进行遍历,就比较容易理解了。
例如:先序遍历
1、首先访问根节点A,然后接下来要去访问它的左子树
2、将它的左子树当成一棵完整的二叉树:
B
/ \
D E
这个你要采用先序来进行遍历的话,还是先遍历根节点,然后左子树,然后右子树。那么这个时候必定要先访问根节点B了。
3、再将B的左子树当成一棵新的二叉树:
D
由于其没有子树了,就只有一个根节点。所以这个时候就访问这个根节点D
4、同样的道理再去访问B的右子树E。
5、到这个地方,对于根节点A的左子树才完整遍历了。
6、同样的道理接着去访问A的右子树,还是将它的右子树当成一个新的二叉树,进行遍历。遍历结果是CFG。
7、最终的遍历结果就是ABDECFG。
/* 我的理解是递归A->B->D,然后就回到A了,怎么到了B就停了 去访问E,就是这点我不理解 ,请你帮我理一下思路,到底是怎么回事啊???*/
你的理解只是单纯的理解为访问左子树的时候,只是左边的是它的左子树,其实在访问的时候只要是处在A左边的全部都是它的左子树。。。
希望我的回答对你有所帮助。。。。。
主要有三种遍历方法,先序遍历,中序遍历,后序遍历。
先序遍历:就是先访问根节点,再访问其左子树。最后访问右子树。
A
/ \
B C
/ \ / \ B
D E F G / \
例如:先访问A,再访问其左子树 D E ,那么,对于这个树,先访问其根节点B,再访问其左子树D。D没有左右子树。于是访问B的右子树E。E没有子树。返回A,访问A的右子树。即:C 与其左子树F和右子树G。最后得出遍历序列是:ABDECFG。
中序遍历:就是先访问左子树,再访问其根节点。最后访问右子树。
遍历方法如上:最后遍历序列:DBEAFCG
后序遍历:先访问左子树,再访问其右子树。最后访问根节点。
同样方法:遍历序列:DEBFGCA
数据结构中的二叉树中的递归怎么理解?
divlist为一个数组,是一个全局变量,存储最终遍历结果。可能有的同学不熟悉JavaScript,node.firstElementChild与node.lastElementChild分别指父节点的第一个元素节点和最后一个元素节点,即对应父节点的左孩子和右孩子。二叉树是以DOM树的形式模拟 所谓递归可以分为两部分来理解:“递”和“归”。“递”指...
二叉树遍历演示
}(2)中序遍历递归算法 void InOrder(BTree BT) { if (BT) { InOrder(BT->Lchild);Visit(BT);InOrder(BT->Rchild);} }(3)后序遍历递归算法 void PostOrder(BTree BT) { if (BT) { PostOrder(BT->Lchild);PostOrder(BT->Rchild);Visit(BT);} } 2 、按层次遍历二叉树 实现...
二叉链表存储二叉树的先序遍历算法
二叉链表存储二叉树的先序遍历算法,通常采用递归的算法实现。首先访问二叉树的根节点,然后递归遍历它的左子树,最后,递归遍历他的右子树。
已知二叉树的中序遍历结果: BDCEAFHG。后序遍历结果:DECBHGFA,画出此二 ...
端,所以HG是F的右子树;5、由于H、G在后序遍历序列G最后出现,所以G是H, G中的根,再看 中序中G左端只有一个H,所以H是G的左子树,得到最终原始二叉树。需要注意的几点:1、根是相对的,对于整棵树而言只有一个根,但对于每棵子树而言,又有自己的根。2、前序遍历时,一棵树的根永远在左...
二叉树的中序、前序、后序的递归、非递归遍历算法,层次序的非递归遍历...
createbintree(&(*t)->lchild);\/\/递归实现左孩子的建立 createbintree(&(*t)->rchild);\/\/递归实现右孩子的建立 } } \/\/二叉树前序遍历递归实现 void preorder(bintree t)\/\/t是指针变量,而不是结点结构体变量 {if(t){ cout<<t->data<<" ";preorder(t->lchild);preorder(t->rchild...
一棵二叉树的先序遍历序列为ABCDEF,中序遍历序列为CBAEDF,则后序遍历...
先序列号为这个,那么在编辑的时候,可以先进行用顺序的方式,然后再进行。后序序列是CBA。根据前序,可以确定A为根,A在中序中的位置,可以确定CB为A的左子树上的结点,没有右子树。确定A之后,再看中序第二值为B,查看B在中序中的位置,C在B左边,确定C为B的左子树。
...表示下图所示二叉树的,并用递归方法输出三种遍历结果。
t->rchild=CreateBinTree();} return t;}\/\/创建一个二叉树。void Visit(BTree t){ if(t!=NULL)printf("%c ",t->data);}\/\/访问结点t。void InOrder(BTree t){ if(t){ InOrder(t->lchild);Visit(t);InOrder(t->rchild);} }\/\/二叉树的递归中序遍历。int HighTree(BTree p){ ...
怎么根据二叉树的两个遍历算出另一个遍历,有什么技巧
用递归法可画出二叉树图然后看图写出你要的遍历哈,下面我给你讲下哈(好理解的):假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道。PreOrder: GDAFEMHZ InOrder: ADEFGHMZ PostOrder: AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢看比如...
二叉树和二叉树排序不同
二叉树遍历 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示[7] 。线索二叉树 按照某种遍历方式对二叉树进行...
二叉树中序遍历递归算法
if(T){ if(InOrderTraverse(T->l,Visit))if(Visit(T->data))if(InOrderTraverse(T->r,Visit)) return OK;return ERROR;}else return OK;以上就是中序遍历二叉树 这段程序我全有,具体如下:include <alloc.h> define ERROR 0;define FALSE 0;define TRUE 1;define OK 1;typedef int ...
乐物金周: 主要有三种遍历方法,先序遍历,中序遍历,后序遍历.先序遍历:就是先访问根节点,再访问其左子树.最后访问右子树. A / \ B C / \ / \ D E F G 对于遍历来说无论是哪种遍历,采取的思路是遍历左子树和右子树的时候,把左子树和右子树当...
贾汪区19129858240: 二叉树递归遍历的问题 - ?
乐物金周: 这是递归的思想.比如一棵有三个节点二叉树,根节点为A,它有一个做孩子节点B,又孩子节点C.首先preorder(A),bt!=NULL,输出A的值.这时候调用preorder(B),B!=NULL,输出B的值,然后preorder(B的左孩子),因为B的左孩子为NULL,所以preorder(B的右孩子),B的右孩子也为空,不输出.这时候才preorder(C),和访问B的过程一样.C的访问结束后对A的访问才完全退出.
贾汪区19129858240: 麻烦高手解释一下二叉树遍历的实现,看了好几遍没看明白啊 - ?
乐物金周: 递归.首先中序遍历根结点,根结点不空,中序遍历左子树,而中序遍历左子树又能递归,所以一直到最左(左子树的左子树的...),这个结点的左子树为空,访问这个结点,然后中序遍历这个结点的右子树,右子树又有递归,如果右子树的左子树不空,中序遍历到右子树的最左,如果左右都为空了后,由递归工作栈返回上一层递归
贾汪区19129858240: 详解二叉树的三个遍历,主要是对递归不好理解,希望能把这个程序用一个实例人为的执行一遍?
乐物金周: 你觉得二叉树非递归很好理解吗?如果是的话,倒是略非主流了...一般人都会觉得递归很好理解. 二叉树的前序遍历的定义是,先遍历当前节点,再遍历左子树,再遍历右子树.如果你考虑这个定义,你会发现这个定义的三部分完全对应代码的...
贾汪区19129858240: 关于二叉树遍历的递归算法 - ?
乐物金周: 代码写错了,要是递归的话,45行的函数应该是 pretrav; 这是深度遍历.逻辑很简单啊:比如一个二叉树:.............A.........../...\..........B.....C........./.\......\........D...E......F......./......G 第一次函数调用,传入节点A.执行到4,左子树非空,..调用 trav函数...
贾汪区19129858240: C语言版数据结构 如何理解二叉树的前、中、后序的递归和非递归遍历?? - ?
乐物金周: 就我看来递归遍历是很容易理解的,除非你不懂C语言递归,难理解的也就是后序非递归遍历.分2步,1、理解前中后遍历流程;2、看算法,回味遍历流程.
贾汪区19129858240: 何谓二叉树的遍历? - ?
乐物金周: 就是按照一定的顺序访问二叉树中的每一个节点.顺序一般有先序遍历,中序遍历和后序遍历 1.中序遍历的递归算法定义: 若二叉树非空,则依次执行如下操作: (1)遍历左子树; (2)访问根结点; (3)遍历右子树.2.先序遍历的递归算...
贾汪区19129858240: 关于二叉树先序遍历的递归算法问题 - ?
乐物金周: 其实理解递归要从栈那里理解的,当遍历到某只有右子树的结点时,若这个结点的lchild结点为空,lchild结点出栈,输出NULL或不输出.因为,是线序遍历,所以,新的栈顶结点就是某个右子树的结点的rchild结点如果rchild结点的lchild和rchild结点都为空就,那么rchild结点出栈,输出rchild结点,栈顶新结点就是某个右子树结点,因为某个右子树的rchild和lchild都输出了,为空,所以直接输出某个右子树的结点如此类推
贾汪区19129858240: 什么是二叉树数的遍历 - ?
乐物金周: 二叉树遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的操作依赖于具体的应用问题.遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础. 遍历方案 从二叉树的递归定...
贾汪区19129858240: 数据结构中"遍历"是什么意思? - ?
乐物金周: 所谓遍历,是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的操作依赖于具体的应用问题. 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础. 扩展资料: 树的遍历是树的一种重要的运...