zoukankan      html  css  js  c++  java
  • 二叉树遍历python3代码(先序、中序、后序、层次)(递归、非递归)

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

    (一)二叉树的中序遍历

    递归:

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

    注:

    1. 类中方法的自我调用

    2. Python中list可以直接相加得到新的list:

    ls1 = [1,2,3]
    ls2 = [4,5,6]
    print(ls1+ls2)

    迭代:

    class Solution:
        def inorderTraversal(self, root: TreeNode) -> List[int]:
            # 迭代解法
            p = root
            res = []
            stack = []
            
            while p or stack:
                if p:
                    stack.append(p)
                    p = p.left
                else:
                    tmp = stack.pop()
                    res.append(tmp.val);
                    p = tmp.right
            
            return res
                    

    (二)二叉树的先序(前序)遍历

    递归:

    class Solution:
        def preorderTraversal(self, root: TreeNode) -> List[int]:
            '''递归解法'''
            p =root
            res = []
            
            if p!=None:
                res.append(p.val)
                res += self.preorderTraversal(p.left)
                res += self.preorderTraversal(p.right)
                
            return res

    迭代:

    class Solution:
        def preorderTraversal(self, root: TreeNode) -> List[int]:
            '''迭代解法'''
            p = root
            res = []
            stack = []
            
            while p or stack:
                if p:
                    res.append(p.val)
                    stack.append(p)
                    p = p.left
                else:
                    temp = stack.pop()
                    p = temp.right
            return res

    (三)二叉树的后序遍历

    递归:

    class Solution:
        def postorderTraversal(self, root: TreeNode) -> List[int]:
            p = root
            res = []
            
            if p:
                res += self.postorderTraversal(p.left)
                res += self.postorderTraversal(p.right)
                res.append(p.val)
            return res

    后序遍历参考资料

    已有详细解释说明,不再说明。

    迭代1:

    class Solution:
        def postorderTraversal(self, root: TreeNode) -> List[int]:
            '''先序遍历思想实现后续遍历'''
            p = root
            #res = []
            stack = []
            stack2 = []
            
            while p or stack:
                if p:
                    stack2.append(p.val)
                    stack.append(p)
                    p = p.right
                else:
                    temp = stack.pop()
                    p = temp.left
            return stack2[::-1]
            

    迭代2:

    class Solution:
        def postorderTraversal(self, root: TreeNode) -> List[int]:
            '''后序遍历双指针迭代算法'''
            if not root:   # 需要判断是否为空
                return []
            
            stack = []
            res = []
            prev = None
            curr = None
            stack.append(root)
            
            while stack:
                curr = stack[-1]
                if prev==None or prev.left==curr or prev.right==curr:
                    if curr.left!=None:
                        stack.append(curr.left)
                    elif curr.right!=None:
                        stack.append(curr.right)
                elif prev == curr.left:
                    if curr.right!=None:
                         stack.append(curr.right)
                else:
                    res.append(curr.val)
                    stack.pop()         # 需要弹出
                prev = curr
            return res
                        

    (四)二叉树的层次遍历

    采用队列组织结构

    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
            
            queue = []
            res = []
            
            p = root
            queue.append(p)
            
            while queue:
                temp = queue.pop(0)
                res.append(temp.val)
                if temp.left!=None:
                    queue.append(temp.left)
                if temp.right!=None:
                    queue.append(temp.right)
            return res
  • 相关阅读:
    Centos启动Cassandra交互模式失败:No appropriate python interpreter found
    删除Kafka的topic
    《面向中国资本市场应用的分布式总账白皮书》笔记
    搭建Kafka集群(3-broker)
    【转】矩阵求导计算规则
    二次型求导
    解决: org.iq80.leveldb.DBException: IO error: C:data rie00945.sst: Could not create random access file.
    SSH遇见的问题
    解决:Redis:java.util.NoSuchElementException: Unable to validate object at
    【转】mysql查询结果输出到文件
  • 原文地址:https://www.cnblogs.com/ACStrive/p/11222390.html
Copyright © 2011-2022 走看看