题解 | 二叉树的后序遍历

二叉树的后序遍历

https://www.nowcoder.com/practice/1291064f4d5d4bdeaefbf0dd47d78541

from ctypes import resize
import queue
from queue import Queue
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return int整型一维数组
#
class Solution:
    # #法1:递归法 左右根
    # def postorder(self,root:TreeNode,res:List[int]):
    #     if not root:
    #         return 
    #     else:
    #         self.postorder(root.left,res)#左递归
    #         self.postorder(root.right,res)#右子树递归
    #         res.append(root.val)#添加根节点

    # def postorderTraversal(self , root: TreeNode) -> List[int]:
    #     # write code here
    #     res=[]
    #     self.postorder(root,res)
    #     return res

    # 法2:根据栈先进后出的特性
# 1:开辟一个辅助栈,用于记录要访问的子节点,开辟一个前序指针pre。
# 2:从根节点开始,每次优先进入每棵的子树的最左边一个节点,我们将其不断加入栈中,用来保存父问题。(同中序遍历)
# 3:弹出一个栈元素,看成该子树的根,判断这个根的右边有没有节点或是有没有被访问过,如果没有右节点或是被访问过了,可以访问这个根,并将前序节点标记为这个根。

# 4:如果没有被访问,那这个根必须入栈,进入右子树继续访问,只有右子树结束了回到这里才能继续访问根。


    def postorderTraversal(self , root: TreeNode) -> List[int]:
    # write code here
        res,stack=[],[]
        pre=None#用于标记右子树是否被访问过

        while stack or root:
            #找到当前节点最左的节点
            while root:
                stack.append(root)#父节点放入栈中
                root=root.left    #找其左子树
            
            stack_top=stack[-1]#取栈顶元素
            stack.pop()

            #与中序遍历不同的地方
            if not stack_top.right or stack_top.right is pre:
            #若当前节点没有右子树或者右子树已被访问过
            #将当前节点添加到答案序列中
                res.append(stack_top.val)
                pre=stack_top#修改pre为当前节点

            else:
                #重新将该节点入栈
                stack.append(stack_top)
                #进入右子树遍历
                root=stack_top.right

        return res


                
                


        
      



全部评论

相关推荐

迷茫的大四🐶:💐孝子启动失败,改为启动咏鹅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务