1. 程式人生 > 其它 >由前序遍歷和中序遍歷構建二叉樹-Python

由前序遍歷和中序遍歷構建二叉樹-Python

思路:

1、由二叉樹的前(先)序序列和中序序列建立該二叉樹

分析:若二叉樹的任意兩個結點的值都不相同,則二叉樹的前序序列和中序序列能唯一確定一棵二叉樹。另外,由前序序列和中序序列的定義可知,前序序列中第一個結點必為根結點,而在中序序列中,根結點剛好是左、右子樹的分界點,因此,可按如下方法建立二叉樹:

1.用前序序列的第一個結點作為根結點;

2.在中序序列中查詢根結點的位置,並以此為界將中序序列劃分為左、右兩個序列(左、右子樹);

3.根據左、右子樹的中序序列中的結點個數,將前序序列去掉根結點後的序列劃分為左、右兩個序列,它們分別是左、右子樹的前序序列;

4.對左、右子樹的前序序列和中序序列遞迴地實施同樣方法,直到所得左、右子樹為空。

例如:假設前序序列為ABDGHCEFI,中序序列為GDHBAECIF

解決:

def rebuild_tree(preorder, inorder):
    if len(preorder) == 0:
        return
    elif len(inorder) == 1:
        return TreeNode(inorder[0])
    else:
        root = preorder[0] # 根據先序找到根節點
        depth = inorder.index(root)     # 找出當前節點在中序遍歷的位置,左側為左子樹,右側為右子樹
temp = TreeNode(root) # 前序遍歷中,去掉首節點,先序的左半邊為depth,右半邊為depth+1到末尾。之後遞迴呼叫rebuild_tree temp.left = rebuild_tree(preorder[1:depth+1], inorder[:depth]) temp.right = rebuild_tree(preorder[depth+1:], inorder[depth+1:]) return temp
時刻記著自己要成為什麼樣的人!