zoukankan      html  css  js  c++  java
  • 二叉树的各种遍历

    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
    
  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/beeblog72/p/13454043.html
Copyright © 2011-2022 走看看