二叉树oj ——>后序遍历(非递归)

Love The Way You Lie 2023-10-02 14:02 64阅读 0赞

题目要求:

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAb2hhbmHvvIE_size_20_color_FFFFFF_t_70_g_se_x_16

解题思路:

后序遍历相对来说比较麻烦一些,但是基本思路没有变

  • 从根节点的左子树开始,保存每一个不为空的结点
  • 当左子树为空时,获取栈顶元素(不是取出!!!),有可能这个结点的右子树不为空,因此判断右子树若不为空,让这个结点继续进行循环
  • 如果为空,就遍历这个结点,并将其出栈,
  • 当我们将上一步执行之后,发现,这个循环又回到了刚刚获取过了的这个结点,如此循环,就形成了死循环
  • 我们的原因是因为无法得知这个结点的值有没有打印,那么就给他添加一个标记,给上一个已经遍历了的结点加上标记,并且,多加一个判断即可

解题代码:

  1. class Solution {
  2. public List<Integer> postorderTraversal(TreeNode root) {
  3. List<Integer> list = new ArrayList<>();
  4. //如果是空树,直接返回
  5. if(root == null){
  6. return list;
  7. }
  8. Stack<TreeNode> s = new Stack<>();
  9. TreeNode cur = root;
  10. TreeNode prev = null;
  11. while(!s.empty() || cur != null){
  12. while(cur != null){
  13. s.push(cur);
  14. cur = cur.left;
  15. }
  16. TreeNode top = s.peek();
  17. if(top.right == null || top.right == prev){
  18. prev = top;
  19. list.add(top.val);
  20. s.pop();
  21. }else{
  22. cur = top.right;
  23. }
  24. }
  25. return list;
  26. }
  27. }

发表评论

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

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

相关阅读