• 二叉树的各种遍历


    94. 二叉树的中序遍历

    题目要求:
    给定一个二叉树,返回它的中序遍历。

    思路:
    递归遍历。

    class Solution:
        def inorder(self, root, lst):
            if not root:
                return
            else:
                self.inorder(root.left, lst)
                lst.append(root.val)
                self.inorder(root.right, lst)
    
        def inorderTraversal(self, root: TreeNode) -> List[int]:
            ans = []
            self.inorder(root, ans)
            return ans
    

    中序遍历即先遍历左子树,再遍历根结点,最后遍历右子树,这是一个递归的概念,可以用一个栈来模拟中序遍历递归的过程。既然是先遍历左子树,就让指针一直向左走,遇到的结点先放入栈中,直到无路可走,就弹出一个结点,访问该结点(对这个结点进行某种操作)。接着访问这个结点的右子树,同样对其进行中序遍历。

    class Solution:
        def inorderTraversal(self, root: TreeNode) -> List[int]:
            ans = []
            stack = []
            while stack or root:
                if root:
                    stack.append(root)
                    root = root.left
                else:
                    node = stack.pop()
                    ans.append(node.val)
                    root = node.right
    
            return ans
    

    144. 二叉树的前序遍历

    题目要求:
    给定一个二叉树,返回它的前序遍历。

    思路:
    同样从递归与辅助栈两个角度来对其进行遍历。

    class Solution:
        def preorder(self, root, lst):
            if not root:
                return
            else:
                lst.append(root.val)
                self.preorder(root.left, lst)
                self.preorder(root.right, lst)
                
        def preorderTraversal(self, root: TreeNode) -> List[int]:
            ans = []
            self.preorder(root, ans)
            return ans
    

    这里先将右孩子放入栈中,再将左孩子放入栈中,这是由于栈先进后出的特性。而先序遍历先访问左子树,再访问右子树,因此要先将右孩子入栈。

    class Solution:
        def preorderTraversal(self, root: TreeNode) -> List[int]:
            if not root:
                return []
            stack = [root]
            ans = []
            while stack:
                node = stack.pop()
                ans.append(node.val)            
                if node.right:
                    stack.append(node.right)
                if node.left:
                    stack.append(node.left)
            return ans
    

    145. 二叉树的后序遍历

    题目要求:
    给定一个二叉树,返回它的后序遍历。

    思路:
    同样从递归与辅助栈两个角度来对其进行遍历。

    class Solution:
        def postorder(self, root, lst):
            if not root:
                return
            else:
                self.postorder(root.left, lst)
                self.postorder(root.right, lst)
                lst.append(root.val)
    
        def postorderTraversal(self, root: TreeNode) -> List[int]:
            ans = []
            self.postorder(root, ans)
            return ans
    

    后序遍历的非递归遍历比较特殊,如果按前面的思路,需要用到两个栈来模拟遍历的过程。不过还有一个更加巧妙的方法,代码如下:

    class Solution:
        def postorderTraversal(self, root: TreeNode) -> List[int]:
            if not root:
                return []
    
            stack = [root]
            ans = []
            while stack:
                root = stack.pop()
                ans.append(root.val)
                if root.left:
                    stack.append(root.left)
                if root.right:
                    stack.append(root.right)
            return ans[::-1]
    

    102. 二叉树的层序遍历

    题目要求:
    给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。

    思路:
    层次遍历需要用到队列来辅助。

    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
    
            from collections import deque
            que = deque()
            que.append(root)
            ans = []
            while que:
                cur = []
                for _ in range(len(que)):
                    node = que.popleft()
                    cur.append(node.val)
                    if node.left:
                        que.append(node.left)
                    if node.right:
                        que.append(node.right)
                ans.append(cur)
            return ans
    
  • 相关阅读:
    poj2421 Constructing Roads *
    poj1789 Truck History *
    关于最小生成树的一些理解
    资源收集【更新】
    poj2313 Sequence ***
    poj1258 AgriNet **
    最大流的算法小结 Algorithm for Maximum Flow
    算法导论18.32 BTREEDELETE的伪代码
    poj2325 Persistent Numbers ****
    23天的单车旅行,从广州到四川,篇首语
  • 原文地址:https://www.cnblogs.com/beeblog72/p/13454043.html
Copyright © 2020-2023  润新知