我們先建立一棵簡單的二叉樹:
代碼如下所示:
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None l1 = TreeNode(1) l2 = TreeNode(2) l3 = TreeNode(3) l4 = TreeNode(4) l5 = TreeNode(5) l6 = TreeNode(6) l7 = TreeNode(7) l1.left = l2 l1.right = l3 l2.left = l4 l2.right = l5 l3.left = l6 l3.right = l7
然后進行先序遍歷:
def pretravale(treenode): if treenode==None: return None print(treenode.val) pretravale(treenode.left) pretravale(treenode.right)
中序:
#利用深度優先搜索進行中序遍歷 def midtravale(treenode): if treenode==None: return None midtravale(treenode.left)#先往左走到底,然后打印根節點 print(treenode.val) midtravale(treenode.right)
后序:
def latetravale(treenode): if treenode == None: return None latetravale(treenode.left) latetravale(treenode.right) print(treenode.val)
打印遍歷結果:
pretravale(l1) print("開始中序遍歷") midtravale(l1) print("開始后序便遍歷") latetravale(l1)
得到:
1 2 4 5 3 6 7 開始中序遍歷 4 2 5 1 6 3 7 開始后序便遍歷 4 5 2 6 7 3 1
當然面試官看到你使用遞歸解法來遍歷這棵樹肯定是不滿意的,因此這里給出對這棵樹的迭代解法,首先是先序遍歷,在遍歷的時候我們可以一直往左進行入棧,當棧中沒有元素可以添加之后,也就是樹的左端的元素已經沒了變成了None,那么我們彈出最尾端的元素,如果說最尾端有元素的話就再次對最尾端的元素的left進行遍歷,如果沒有則返回到上一級的樹根。
# 使用非遞歸的方式進行先序遍歷 def preOrder(root): if root==None: return None stack=[] tmpNode=root while tmpNode or stack:#不能為空 while tmpNode: print(tmpNode.val) stack.append(tmpNode) tmpNode=tmpNode.left#繼續找這個跟節點的左子樹 #將左子樹一直放到里面,直到沒有左子樹 node = stack.pop() tmpNode = node.right# 假設node.right為空則tmpNode也為空 #如果不為空的話,那么node.right就賦值給新的tmpNode
中序遍歷我們改變一下打印的順序就好了,畢竟都是深度優先搜索(DFS):
#中序遍歷 def midOrder(root): if root==None: return None stack=[] tmpNode=root while tmpNode or stack:#不能為空 while tmpNode: #print(tmpNode.val) stack.append(tmpNode) tmpNode=tmpNode.left#繼續找這個跟節點的左子樹 #將左子樹一直放到里面,直到沒有左子樹 node = stack.pop() print(node.val) tmpNode = node.right# 假設node.right為空則tmpNode也為空 #如果不為空的話,那么node.right就賦值給新的tmpNode
后續遍歷的迭代解法可以留給大家自己去思考