二叉树后序遍历(递归+非递归)Java

我不是女神ヾ 2023-05-31 12:21 100阅读 0赞

目录

  • 一、结构
  • 二、遍历二叉树
    • 1.后序遍历(递归)
      • 代码
      • 图解
    • 2.后序遍历(非递归)
      • 代码
      • 图解

一、结构

在这里插入图片描述

二、遍历二叉树

这块内容是二叉树最核心的部分。不但要掌握七种遍历的写法,前、中、后序的递归、非递归写法+层次遍历,还有学会(1)用前、中、后序遍历数组创建二叉树;(2)用一维数组存储二叉树。

1.后序遍历(递归)

前序遍历访问节点的顺序是 左儿子-右儿子-根节点。

代码

  1. public void postOrderRecur(Node root) {
  2. if (root == null) {
  3. return;
  4. }
  5. postOrderRecur(root.left);
  6. postOrderRecur(root.right);
  7. System.out.print(root.data + " -> ");
  8. }

注意:这个代码是不是很眼熟呢?其实就是把前序或中序遍历中的一行代码换了个位置。

图解

初始。
在这里插入图片描述
第一步:
(1)执行postOrderRecur(Node root)方法,root不为null,于是调用postOrderRecur(root.left)方法,访问节点B;
(2)B不为空,继续调用postOrderRecur(B.left)方法,访问节点D;
(3)D不为空,调用postOrderRecur(D.left)方法,D.left为空,返回;
(4)调用postOrderRecur(D.right)方法,访问节点H;
(5)H不为空,调用postOrderRecur(H.left)方法,H.left为空,返回;
(6)调用postOrderRecur(H.right)方法,H.right为空,返回;
(7)打印“H”。
在这里插入图片描述
第二步:
(1)打印“H”的语句执行完后,其所在的方法结束,返回上一级方法;
(2)打印“D”。
在这里插入图片描述
第三步:
(1)打印“D”的语句执行完后,其所在的方法结束,返回到上一级方法;
(2)调用postOrderRecur(B.right)方法,访问节点E;
(3)递归调用postOrderRecur(E.left)方法,访问节点I;
(4)递归调用postOrderRecur(I.left)方法,I.left为空,返回;
(5)递归调用postOrderRecur(I.right)方法,H.right为空,返回;
(6)打印“I”。
在这里插入图片描述
第四步:
(1)打印“I”的语句执行完后,其所在的方法结束,返回到上一级方法;
(2)调用postOrderRecur(E.right)方法,访问节点J;
(3)递归调用postOrderRecur(J.left)方法,J.left为空,返回;
(4)递归调用postOrderRecur(J.right)方法,J.right为空,返回;
(5)打印“J”。
在这里插入图片描述
第五步:
(1)打印“J”的语句执行完后,其所在的方法结束,返回到上一级方法;
(2)打印“E”。
在这里插入图片描述
第六步:
(1)打印“E”的语句执行完后,其所在的方法结束,返回到上一级方法;
(2)打印“B”。
在这里插入图片描述
第七步:
(1)打印“E”的语句执行完后,其所在的方法结束,返回到上一级方法;
(2)调用postOrderRecur(A.right)方法,访问节点C;
(3)递归调用postOrderRecur(C.left)方法,访问节点F;
(4)递归调用postOrderRecur(F.left)方法,F.left为空,返回;
(5)递归调用postOrderRecur(F.right)方法,F.right为空,返回;
(6)打印“F”。
在这里插入图片描述
第八步:
(1)打印“F”的语句执行完后,其所在的方法结束,返回到上一级方法;
(2)调用postOrderRecur(C.right)方法,访问节点G;
(3)递归调用postOrderRecur(G.left)方法,G.left为空,返回;
(4)递归调用postOrderRecur(G.right)方法,G.right为空,返回;
(5)打印“G”。
在这里插入图片描述
第九步:
在这里插入图片描述
第十步:
在这里插入图片描述
打印顺序:HDIJEBFGCA

2.后序遍历(非递归)

代码

要实现访问顺序为左儿子-右儿子-根节点,可以利用后进先出的栈,在节点不为空的情况下,依次将根节点、右儿子、左儿子压入一个栈中,最后一起打印栈中的元素。

  1. public void postOrder() {
  2. Node current = root;
  3. //就是图中的S1,把LinkedList作为栈使用
  4. LinkedList<Node> s1 = new LinkedList<Node>();
  5. //就是图中的S2,把LinkedList作为栈使用
  6. LinkedList<Node> s2 = new LinkedList<Node>();
  7. while (current != null || !s1.isEmpty()) {
  8. while (current != null) {
  9. s1.addFirst(current);
  10. s2.addFirst(current);
  11. current = current.right;
  12. }
  13. if (!s1.isEmpty()) {
  14. current = s1.removeFirst();
  15. current = current.left;
  16. }
  17. }
  18. while (!s2.isEmpty()) {
  19. System.out.print(s2.removeFirst().data + " -> ");
  20. }
  21. }

图解

初始。
在这里插入图片描述
图一:
在这里插入图片描述
图二:
在这里插入图片描述
图三:
在这里插入图片描述
图四:
在这里插入图片描述
图五:
在这里插入图片描述
图六:
在这里插入图片描述
图七:
在这里插入图片描述
图八:
在这里插入图片描述
图九:
在这里插入图片描述
图十:
在这里插入图片描述
图十一:
在这里插入图片描述
最后再从栈S2取出元素,得到打印顺序为HDIJEBFGCA

发表评论

表情:
评论列表 (有 0 条评论,100人围观)

还没有评论,来说两句吧...

相关阅读