1. 程式人生 > 實用技巧 >二叉樹的遍歷(python實現)

二叉樹的遍歷(python實現)

目錄

一、層序遍歷

1.使用佇列實現

輸入根節點,使用佇列來遍歷。先進的節點會先出去,出去時將自己的子節點放到佇列中。

def level(root):
	if not root:
		return None
	queue=[root]
	res=[]
	while queue:
		node = queue.pop(0)
		res.append(node)
		if node.left:
			queue.append(node.left)
		if node.right:
			queue.append(node.right)
return res

2.使用遞迴實現

   result = []     
   def add_to_result(level, node):
        if not node:
             return None  
        if level > len(result) - 1:
             result.append([])			#到達新的一層的開頭,要初始化一層
         result[level].append(node.val)
         add_to_result(level+1, node.left)
         add_to_result(level+1, node.right) 
  add_to_result(0, root)
  return result

二、前序遍歷

1.遞迴

遍歷順序:根--左子樹--右子樹

res=[]
def preorder(root):
	if not root:
		return None
	res.append(root.val)
	preorder(root.left)
	preorder(root.right)

2.迭代

使用棧,先進後出,遍歷左節點,知道葉子節點。然後出棧,遍歷上一級的右節點,然後再出.......

  res = [ ]
  stack = []
  node = root
  while res or len(stack)>0:
       while node:
             stack.append(node)
              res.append(node.val)
              node = node.left
        node = stack.pop()
        node = node.right

三、中序遍歷

1.遞迴

遍歷順序:左子樹--根--右子樹

res=[]
def midorder(root):
	if not root:
		return None
	midorder(root.left)
	res.append(root.val)			#呼叫順序更改一下
	midorder(root.right)

2.迭代

  res = [ ]
  stack = []
  node = root
  while res or len(stack)>0:
       while node:
             stack.append(node)
             node = node.left					#到達最深的左節點
        node = stack.pop()
        res.append(node.val)					#出棧後再加入結果
        node = node.right

四、後序遍歷

1.遞迴

遍歷順序:左子樹--右子樹--根

      res=[]
        def postorder(root):
            if not root:
                return None
            postorder(root.left)
            postorder(root.right)
            res.append(root.val)
        postorder(root)

2.迭代

和前序遍歷思路一樣,不過先遍歷右子樹,最後將結果逆序

        res=[]
        stack = []
        node = root
        if not root:
            return None
        while node or len(stack)>0:
            while node:
                stack.append(node)
                res.append(node.val)
                node = node.right
            node = stack.pop()
            node = node.left
        return res[::-1]