【剑指offer22】python遍历二叉树

一、前序遍历、中序遍历和后序遍历

使用递归方法,只需改变返回数据顺序即可

class Solution:
    def preorderTraversal(self, root):  ##前序遍历
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return [] 
        return  [root.val] + self.inorderTraversal(root.left) + self.inorderTraversal(root.right)

	def inorderTraversal(self, root):  ##中序遍历
	        """
	        :type root: TreeNode
	        :rtype: List[int]
	        """
	        if not root:
	            return [] 
	        return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)

        
    def postorderTraversal(self, root):  ##后序遍历
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return [] 
        return  self.inorderTraversal(root.left) + self.inorderTraversal(root.right) + [root.val]


二、层次遍历

题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
方法:广度优先遍历 深度优先遍历

广度优先遍历

广度优先遍历是按层层推进的方式,遍历每一层的节点。
中心思想:使用辅助队列,遍历每一层节点,将该层节点送入队列中,再取出存到一个列表中,不断重复该过程,得到二叉树的所有节点。
代码

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回从上到下每个节点值列表,例:[1,2,3]
    def PrintFromTopToBottom(self, root):
        # write code here
        if not root:
            return []
        queue = []
        result = []
         
        queue.append(root)
        while len(queue) > 0:
            node = queue.pop(0)
            result.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
         
        return result

if __name__ == '__main__':
    s = Solution()
    res = s.PrintFromTopToBottom([1, 2, 3])
    print(res)

深度优先遍历

深度优先遍历是尽可能深的去遍历每个节点的左右子树。
中心思想:使用递归函数进行层次遍历需要有一个参数level,该参数表示当前结点的层数。遍历的结果返回到一个二维列表sol中,sol中的每一个子列表保存了对应index层的从左到右的所有结点value值。
例如:[1,2,3],对于根节点1来说,2和3是它的左右子树。首先遍历第一层的节点1,二维列表sol为[ [1] , [ ] ],然后递归遍历1的左右子节点。遍历第二层的节点2,得到二维列表sol为[ [1] , [2], [ ]],然后遍历2的左右子节点,由于2没有左右子节点,则返回空,此时sol为[ [1] , [2]]。再遍历第二层的节点3,同上,最后得到所有节点。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回从上到下每个节点值列表,例:[1,2,3]
    def PrintFromTopToBottom(self, root):
        # write code here
        def helper(node, level):
            if not node:
                return
            else:
                sol[level-1].append(node.val)
                if len(sol) == level:  # 遍历到新层时,只有最左边的结点使得等式成立
                    sol.append([])
                helper(node.left, level+1)
                helper(node.right, level+1)
        sol = [[]]
        helper(root, 1)
        a = []
        while sol:
            a += sol.pop(0)
        return a

if __name__ == '__main__':
    s = Solution()
    res = s.PrintFromTopToBottom([1, 2, 3])
    print(res)
发布了56 篇原创文章 · 获赞 1 · 访问量 1693

猜你喜欢

转载自blog.csdn.net/weixin_44549556/article/details/104267376