⼆叉树的前序,中序,后序遍历
前序遍历:根节点->左⼦树->右⼦树(根->左->右)
fork
中序遍历:左⼦树->根节点->右⼦树(左->根->右)
4366
后序遍历:左⼦树->右⼦树->根节点(左->右->根)
技巧:看根节点打印的顺序,出现在前还是中,后.
necklace怎么读前序遍历:GDAFEMHZ
中序遍历: ADEFGHMZ
后序遍历:AEFDHZMG
前序:
第⼀步:打印该节点(再三考虑还是把访问根节点这句话去掉了)
第⼆步:访问左⼦树,返回到第⼀步(注意:返回到第⼀步的意思是将根节点的左⼦树作为新的根节点,就好⽐图中D是G的左⼦树但是D也是A节点和F节点的根节点)
第三步:访问右⼦树,返回到第⼀步
第四步:结束递归,返回到上⼀个节点
中序:
第⼀步:访问该节点左⼦树
tanya
第⼆步:若该节点有左⼦树,则返回第⼀步,否则打印该节点
乱码翻译
第三步:若该节点有右⼦树,则返回第⼀步,否则结束递归并返回上⼀节点
(按我⾃⼰理解的中序就是:先左到底,左到不能在左了就停下来并打印该节点,然后返回到该节点的上⼀节点,并打印该节点,然后再访问该节点的右⼦树,再左到不能再左了就停下来)
后序:
第⼀步:访问左⼦树
第⼆步:若该节点有左⼦树,返回第⼀步
i tell you第三步:若该节点有右⼦树,返回第⼀步,否则打印该节点并返回上⼀节点
后序遍历的另⼀种表述:
(1)后序遍历左⼦树
(2)后序遍历右⼦树
(3)访问根节点
(在完成1,2步的时候,依然要按照后序遍历的规则来完成)
案例分析
第⼀种:已知前序遍历、中序遍历求后序遍历
前序遍历:ABCDEF
中序遍历:CBDAEF
求后序遍历?
解题思路
1、前序遍历的第⼀元素是整个⼆叉树的根节点
2、中序遍历中根节点的左边的元素是左⼦树,根节点右边的元素是右⼦树
3、后序遍历的最后⼀个元素是整个⼆叉树的根节点
第⼀步:先看前序遍历A肯定是根节点
第⼆步:确认了根节点,再来看中序遍历,中序遍历中根节点A的左边是CBD,右边是EF,所有可以确定⼆叉树既有左⼦树⼜有右⼦树
第三步:先来分析左⼦树CBD,那么CBD谁来做A的左⼦树呢?这个时候不能直接⽤中序遍历的特点(左->根->右)得出左⼦树应该是这个
样⼦
因为有两种情况都满⾜中序遍历为CBD⽆法直接根据中序遍历来直接得出左⼦树的结构,这个时候就要返回到前序遍历中去vacance
观察前序遍历ABCDEF,左⼦树CBD在前序遍历中的顺序是BCD,意味着B是左⼦树的根节点(这么
说可能不太好理解,换个说法就是B是A的左⼦树),得出这个结果是因为如果⼀个⼆叉树的根节点有左⼦树,那么
这个左⼦树⼀定在前序遍历中⼀定紧跟着根节点(这个是⽤前序遍历的特点(根->左->右)得出的),到这⾥就可以确认B是左⼦树的根节点
第四步:再观察中序遍历CBDAEF,B元素左边是C右边是D,说明B节点既有左⼦树⼜有右⼦树,左右⼦树只有⼀个元素就可以直接确定
了,不⽤再返回去观察前序遍历yoy
六级吧第五步:到这⾥左⼦树的重建就已经完成了,现在重建右⼦树,因为重建右⼦树的过程和左⼦树的过程⼀模⼀样,步骤就不像上⾯写这么细了((┬_┬)),观察中序遍历右⼦树为EF,再观察前序遍历ABCDEF中右⼦树
的顺序为EF,所以E为A的右⼦树,再观察中序便利中E只有右边有F,所有F为E的右⼦树,最后得到的⼆叉树是这个样⼦的davy jones
所以求得的后序遍历为:CDBFEA
总结⼀下上述步骤: 先观察前序遍历找到根节点->观察中序遍历将根节点左边归为左⼦树元素,右边归为右⼦树元素(可能会出现只有左⼦树或者右⼦树的情况)->观察前序遍历中左\右⼦树⼏个元素的顺序,最靠前的为左\右⼦树的根节点->重复前⾯的步骤
第⼆种:已知中序遍历、后序遍历求前序遍历(题还是上⾯这道)
中序遍历:CBDAEF
后序遍历为:CDBFEA
仍然是根据不同遍历⽅式结果的特点来重构⼆叉树,过程很相似这⾥就不详细说了,后序遍历的最后⼀个元素A是根节点,在中序遍历中以根节点A作为分界将元素分为左⼦树(CBD)和右⼦树(EF),再观察后序遍历中左⼦树的顺序是CDB
,可以判断出B是左⼦树的根节点(因为后序遍历是:左->右->根),再观察中序遍历,B元素左边是C右边是D,说明B节点既有左⼦树⼜有右⼦树,左右⼦树只有⼀个元素就可以直接确定了,不⽤再返回去观察后序遍历,左⼦树重建完成,
现在来看右⼦树,右⼦树有两个元素EF,观察后序遍历E在F的后⾯,所以E是右⼦树的根节点,然后看中序遍历中E只有右边⼀个F元素了,即F是E的右⼦树,此时整个⼆叉树重构完成
总结⼀下上述步骤:先观察后序遍历找到根节点->观察中序遍历将根节点左边归为左⼦树元素,右边归为右⼦树元素(可能会出现只有左⼦树或者右⼦树的情况)->观察后序遍历中左\右⼦树⼏个元素的顺序,最靠后的为左\右⼦树的根节点->重复前⾯的步骤
注意:已知前序遍历、后序遍历⽆法求出中序遍历(因为由前序后序重构出来的⼆叉树不⽌⼀种)