算法通关村——迭代实现二叉树的前中后序遍历

Myth丶恋晨 2024-03-23 19:47 62阅读 0赞

前言

递归就是每次执行方法调用都会先把当前的局部变量、参数值和返回地址等压入栈中,后面在递归返回的时候,从栈顶弹出上一层的各项参数继续执行,这就是递归为什么能够自动返回并执行上一层的方法的原因。因此,我们也可以模拟一个栈,将结果压入栈中,然后再从栈中弹出节点,就这样进行左右子树的遍历

迭代法实现前序遍历

前序遍历是中左右,如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。 不难写出如下代码: (注意代码中,空节点不入栈)

代码实现

  1. public List<Integer> preOrderTraverse(TreeNode root){
  2. List<Integer> res = new ArrayList<>();
  3. if(root == null){
  4. return res;
  5. }
  6. Deque<TreeNode> stack = new LinkedList<>();
  7. TreeNode temp = root;
  8. while(!stack.isEmpty() || temp != null){
  9. while(temp != null){
  10. res.add(temp.val);
  11. stack.push(temp);
  12. temp = temp.left;
  13. }
  14. temp = stack.pop();
  15. temp = temp.right;
  16. }
  17. return res;
  18. }

迭代法实现中序遍历

代码实现

  1. /**
  2. * 迭代法 实现 中序遍历
  3. * @param root 根节点
  4. * @return 中序遍历的节点集合
  5. */
  6. public List<Integer> cenOrderTraverse(TreeNode root){
  7. List<Integer> res = new ArrayList<>();
  8. if (root == null){
  9. return res;
  10. }
  11. Deque<TreeNode> stack = new LinkedList<>();
  12. while ( root != null || ! stack.isEmpty()){
  13. while (root != null){
  14. stack.push(root);
  15. root = root.left;
  16. }
  17. root = stack.pop();
  18. res.add(root.val);
  19. root = root.right;
  20. }
  21. return res;
  22. }

迭代法实现后序遍历

实现要点

后序遍历的非递归实现有三种基本的思路: 反转法、访问标记法、和Morris法可惜三种理解起来都有些难度,如果头发不够,可以等一等再学习。
这里只介绍一种好理解又好实现的方法: 反转法

实现思路

如下图,我们先观察后序遍历的结果是seg=9 5 7 4 3,如果我们将其整体反转的话就是new seq={3 4 7 5 9}

image.png

要得到new seq的方法和前序遍历思路几乎一致,只不过是左右反了。前序是先中间,再左边然后右边,而这里是先中间,再后边然后左边。那我们完全可以改造一下前序遍历,在前序基础上修改左右孩子进入栈的顺序,即先遍历右孩子,将其压入栈,最后才遍历左孩子,得到序列new seq之后再通过Collections工具类的reverse()方法,再reverse一下就是想要的结果了,代码如下:

  1. /**
  2. * 反转法 实现 后序遍历
  3. * @param root 根节点
  4. * @return 后序遍历的节点集合
  5. */
  6. public List<Integer> postOrderTraverse(TreeNode root){
  7. ArrayList<Integer> res = new ArrayList<>();
  8. if (root == null){
  9. return res;
  10. }
  11. Deque<TreeNode> stack = new LinkedList<>();
  12. TreeNode node = root;
  13. while (!stack.isEmpty() || node != null){
  14. while (node != null){
  15. res.add(node.val);
  16. stack.push(node);
  17. node = node.right;
  18. }
  19. node = stack.pop();
  20. node = node.left;
  21. }
  22. Collections.reverse(res);
  23. return res;
  24. }

发表评论

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

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

相关阅读