后续遍历的递归实现
后续遍历指的是先访问节点的左右孩子,最后访问节点本身。所以使用后序遍历得到的结果的最后一个节点就是根节点。采用后续遍历的具体步骤如下:
- 先访问根节点,如果有左孩子,进入第二步;如果有右孩子,进入第三步
- 对左孩子继续判断其是否有左孩子,直到某节点的左孩子为空,设为cur节点
- 对右孩子继续判其是否有左孩子,直到某个节点的左孩子为空,设为curR节点
- cur节点访问之后,访问其双亲节点的右孩子,如果其双亲节点的右孩子不为空的话。接着访问cur节点的双亲节点,设为curP节点。
- cur节点的双亲节点访问结束之后,继续访问curP节点的右孩子(如果不为空的话),接着访问curP节点本身
- 重复以上过程直到根节点
- 继续访问根节点的右孩子,回到第三步,访问curR节点之后,访问其双亲节点的右孩子(如果有的话)
- 最后访问curR的双亲节点本身
重复以上过程直到访问根节点,访问结束
比如下面的二叉树后序遍历的访问结果是:24,15,5,7,6,30,9,28,11,10,8
那么使用递归实现的代码如下:
public void postOrderTraverse(TreeNode node){
if(node == null) return;
postOrderTraverse(node.left);
postOrderTraverse(node.right);
System.out.print(node.val + " ");
}
后续遍历的非递归实现