Leetcode_4_Tree_144,94,145,102二叉树的前、中、后序、层次遍历

这道题前、中、后序遍历用栈来做特别简单,本质上属于迭代的一种,敲代码时一定要注意栈First in, last out的特点,千万别写反了。放张图理解一下:

Leetcode_4_Tree_144,94,145,102二叉树的前、中、后序、层次遍历_第1张图片

Status用作标志,True的话就是说你回头可以直接去结果res里了;False的话就是说你先去栈Stack里好好待着吧。

1.前序遍历(根、左、右)

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:return []
        stack=[(root,False)]
        res=[]
        while stack:
            cur,status=stack.pop()
            if status:
                res.append(cur.val)
            else:
                if cur.right:stack.append((cur.right,False))
                if cur.left:stack.append((cur.left,False))
                stack.append((cur,True))  #前、中、后序的差别只在于这句话放置的位置
        return res

 

2.中序遍历(左、根、右)

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:return []
        stack=[(root,False)]
        res=[]
        while stack:
            cur,status=stack.pop()
            if status:
                res.append(cur.val)
            else:
                if cur.right:stack.append((cur.right,False)) 
                stack.append((cur,True))    #前、中、后序的差别只在于这句话放置的位置
                if cur.left:stack.append((cur.left,False))
                
        return res
        

3.后序遍历(左、右、根)

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:return []
        stack=[(root,False)]
        res=[]
        while stack:
            cur,status=stack.pop()
            if status:
                res.append(cur.val)
            else:
                stack.append((cur,True))    #前、中、后序的差别只在于这句话放置的位置
                if cur.right:stack.append((cur.right,False)) 
                if cur.left:stack.append((cur.left,False))
                
        return res
        

4、层次遍历

用队列来做,即First in,first out. 比上面三种遍历稍微好理解点儿~

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:return []
        queue=[(root,0)]
        res=[]
        while queue:
            node,level=queue.pop(0) #一定要注意pop()是栈的专属操作,即取出并删除最后一个元素;
                                    #而pop(0)才是队列的专属操作,即取出并删除第一个元素。
            
            if len(res)!=level+1:
                res.append([])
                
            res[level].append(node.val)
            if node.left:
                queue.append((node.left,level+1))
            if node.right:
                queue.append((node.right,level+1))
                
        return res
            

 

 

你可能感兴趣的:(Leetcode_4_Tree_144,94,145,102二叉树的前、中、后序、层次遍历)