天天看点

二叉树  前序 后继  怎么理解

进来学习二叉树,在插入删除时对二叉树的前序后继,自我感觉有点绕,让人摸不着头脑,百度后,竟没有发现一篇讲解怎么理解二叉树的前序与后继,于是自己研究起来。

1.二叉树前序与后继的一个判断分割点是(以中序前序为例子), 就是这个节点(这个节点设为N)有没有可能是这个二叉树中最后一个访问的节点(要注意一定只要考虑以这个节点为头的情况如下)                                                

二叉树  前序 后继  怎么理解

L与R并不是只是一个节点而是代表左右子树 那么N是有可能成为第一个节点的(中序),就是当L为空时,那么if(左子树为空)就是一个条件 下面分为 if(左树为空) { } else { } 当左子树为空时,那么它的后继不在这棵树内,我们就要上溯(往上找),在这补充一下,不管是先序 中序 还是后序  每一个树都会先遍历完再会上溯, 所以我们开始往上找 ,设它的第一个节点为F,不要管N是F的左子树,还是右子树。                      

二叉树  前序 后继  怎么理解

上溯是把他与父节点看做是一个树,那么下面就要看这棵树是否有可能第一个访问的节点是我们那个节点,下面我们要考虑以N为头的这棵树作为以F为头的树的子树,有没有可能在以F为头的 树中是先访问的,把以N为头的子树看做整体,不用关心内部,因为上面的假设已经保证只要先访问以N为头的树,就一定会先访问N节点,因为L为空,(L不为空的情况在if(左树不为空里考虑)) 下面就有分情况了如果以N为头的子树是F的左子树,那么按照中序,以N为头的数就会先访问,若是F的右子树,那么F节点就是前驱,若为左子树,那么把按照之前的方法吧以F为头的子树看做一个整体 再向上走一层。因为N的左子树为空,且N为F的左子树,那么若访问F这棵树一定先访问N节点,所以可以看做一个整体。

最后这样上溯,只要这个整体是某个节点的右子树就终止了,所以现在可以写程序了。 if(N的左子树不为空) { 那么遍历左子树的最后一个节点就是前驱 } else { if(N为F左子树) { F节点就是前驱         } else { 找到右父节点 } }

继续阅读