由前序遍歷和中序遍歷構建二叉樹-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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM