【二叉樹】根據中序、后序構建二叉樹,前序、中序構建二叉樹


二叉樹的構建是一個常常考察的內容,有關二叉樹的題目一般是使用遞歸方法解決,但是找到合適的遞歸方程很關鍵。

前序遍歷:先看根節點,然后是左子樹,最后是右子樹。

中序遍歷:先看左子樹,然后是根節點,最后是右子樹。

后序遍歷:先看左子樹,然后是右子樹,最后是根節點。


前序: 根左右,可以根據這個結構先確定根的值,和位置。就是序列的第一個值

中序:左根右

后序:左右根, 可以根據序列判別樹的根節點的值和位置。也就是后序序列最后一個值。


接下來列出前+中構建二叉樹的Python代碼實現:

class Node:
    def __init__(self, data, left, right):
        self.data = data
        self.left = left
        self.right = right


def construct_tree(pre_order, mid_order):
    # 忽略參數合法性判斷
    if len(pre_order) == 0:
        return None
    # 前序遍歷的第一個結點一定是根結點
    root_data = pre_order[0]
    i = mid_order.index(root_data)  # 取出mid_order中根節點位置,左邊的是左子樹,右邊的是右子樹
    # 遞歸構造左子樹和右子樹
    left = construct_tree(pre_order[1: 1 + i], mid_order[:i])  # pre_order里其余元素都在i后,所以前序中只有根節點一個在左子樹;mid_order里左子樹元素都在i左邊
    right = construct_tree(pre_order[1 + i:], mid_order[i + 1:])  # pre_oder里其余元素都在i后,所以中序中其余節點都在右子樹;mid_order里右子樹元素都在i右邊
    return Node(root_data, left, right)

 中+后生成二叉樹:  Leetcode 106.

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def buildTree(self, inorder, postorder):
        """
        :type inorder: List[int]
        :type postorder: List[int]
        :rtype: TreeNode
        """
        if not postorder:
            return None
        root = TreeNode(postorder[-1])  # 后序最后一個節點是根節點
        n = inorder.index(root.val)  # 取出中序中根節點的index,可以快速判別左右子樹
        root.left = self.buildTree(inorder[:n], postorder[:n])  # 在中序中,根節點的左子樹元素都在左邊;在后序中,根節點的右子樹元素也都在左邊
        root.right = self.buildTree(inorder[n+1:], postorder[n:-1])  # 在中序中,根節點的右子樹元素都在右邊;在后序中,也都在左邊,但是就不取最后一個元素了,因為最后一個是根
        return root

 

加油!!

 


免責聲明!

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



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