什麼是二叉樹?
在計算機科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”,左子樹和右子樹同時也是二叉樹。二叉樹的子樹有左右之分,並且次序不能任意顛倒。二叉樹是遞歸定義的,所以一般二叉樹的相關題目也都可以使用遞歸的思想來解決,當然也有一些可以使用非遞歸的思想解決。
需要注意二叉樹本身就是遞歸定義的,所以大部分二叉樹問題都能很好的用遞歸算法去解決。
二叉樹的遍歷
二叉樹中最基礎的問題就是二叉樹的前序中序後序以及層次遍歷,熟練掌握這幾種方法對其他的二叉樹問題有很大的幫助。
二叉樹的遍歷問題可以用遞歸和非遞歸(使用棧和隊列)的方法來解決,一般來說遞歸算法的代碼量較小更簡單易懂。下面就讓我們具體的一個個分析二叉樹的遍歷問題,在本文中我們只討論遞歸算法,希望大家能深入瞭解遞歸的思想,其他棧,隊列的解法大家可以自行研究一下。
二叉樹的前序遍歷
先訪問根,再遍歷左子樹,再遍歷右子樹。典型的遞歸思想。
遞歸方法具體思路:
首先判斷終止條件:噹噹前節點爲空則返回空
否則按 左 右的順序依次打印
class Solution(object):
def __init__(self):
self.res = []
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root == None:
return []
self.res.append(root.val)#每次遍歷到根結點就把它加到隊列中
self.preorderTraversal(root.left)#當有左節點的時候就處理左節點
self.preorderTraversal(root.right)#當同級沒有左節點的時候再處理右節點
return self.res
二叉樹的中序遍歷
中序遍歷的順序:左中右
中序遍歷就是從二叉樹的根結點出發,當第二次到達結點時就輸出結點數據,按照先向左在向右的方向訪問。
遞歸的思路:在左子樹存在時盡力遍歷左子樹,當到底的時候將左葉子節點添加進列表,將其父節點加入列表 之後看父節點是否有右子樹當只有右子樹沒有左子樹時將右子樹的值加入
左子樹 ---> 根結點 ---> 右子樹
class Solution(object):
def __init__(self):
self.res = []#必須要在這裏聲明一個屬性不然每次調用就被置零了
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root != None:
self.inorderTraversal(root.left)#先走到最左的葉子節點
self.res.append(root.val)#當左節點全遍歷完了添加父結點
self.inorderTraversal(root.right)#之後看右子樹
return self.res
二叉樹的後序遍歷
後序遍歷的順序:左右中
class Solution(object):
def __init__(self):
self.ret = []#必須要在這裏聲明一個屬性不然每次調用就被置零了
def postorderTraversal(self, root):
if root == None:
return []
self.postorderTraversal(root.left)
self.postorderTraversal(root.right)
self.ret.append(root.val)
return self.ret
小結
二叉樹的前中後序遍歷的算法本質上沒有區別,只是順序的差別(特別的是父節點用append(root.val)其他直接遞歸)
本質上是優先遞歸一種進到最底層 然後一層層彈出。