leetcode笔记之[145. 二叉树的后序遍历]

54 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

一、题目描述:

145. 二叉树的后序遍历 - 力扣(LeetCode)

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历

示例 1:

image.png

输入:root = [1,null,2,3]
输出:[3,2,1]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

二、思路分析:

后序遍历的迭代操作与前序遍历的迭代操作类似,
第一次遍历到根的到时候将根放入栈中并且遍历根的左节点,
区别在于第二次遍历到根的时候发现根在栈中,此时你不知道根的右节点是否访问过,所以需要一个visit数组进行判定,
第二次遍历完第三次遍历发现根在栈中并且根在visit数组之中(visit数组是用来区分第二次遍历到与第三次遍历到的),此时可以将根出栈并打印了,注意此时这个根已经访问完了,所以需要将对应的节点标记为None,方便下一次从栈中取出节点进行遍历

三、AC 代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        visit = []
        result = []
        stacks = []
        current = root
        while   len(stacks) != 0 or current != None:
            if  current != None:
            #不为None的时候,说明未曾被访问过
                stacks.append(current)
                current = current.left
            else:
                current = stacks[len(stacks)-1]
                if  current  not  in  visit:
            #visit用来标记右子树是否访问过,如果未标记过,访问右子树
                    visit.append(current)
                    current = current.right
                else:
            #右子树是否访问过,此时左右子树均访问过,开始访问根节点
                    stacks.pop()
                    result.append(current.val)
                    current = None
        return  result

范文参考

[极简] JS 递归实现 - 二叉树的后序遍历 - 力扣(LeetCode)

C语言常规做法|145. 二叉树的后序遍历 - 二叉树的后序遍历 - 力扣(LeetCode)