【劍指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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章