一、前序遍歷、中序遍歷和後序遍歷
使用遞歸方法,只需改變返回數據順序即可
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)