Likouブラッシングノート:105。プレオーダーおよびミドルオーダーのトラバースシーケンスからバイナリツリーを構築します&& 106.ミドルオーダーおよびポストオーダーのトラバースシーケンスからバイナリツリーを構築します(再帰、詳細なメモ、比較表示は、理解できる)

インタビューの必要性:バイナリツリーのプレオーダー、ミドルオーダー、およびポストオーダートラバーサル:https
//blog.csdn.net/weixin_44414948/article/details/114646712

105.プレオーダーおよびミドルオーダーのトラバーサルシーケンスからバイナリツリーを構築します

二分木は、ツリーのプレオーダートラバーサルとミドルオーダートラバーサルに従って構築されます。

注意:

ツリーに重複する要素はないと想定できます。

たとえば、与えられた

プレオーダートラバーサルpreorder = [3,9,20,15,7]インオーダー
トラバーサルinorder = [9,3,15,20,7]
は、次の二分木を返します。
ここに画像の説明を挿入します

105.問題解決のPythonコード:

アイデア:プレオーダートラバーサルの最初の要素はルートノードである必要があります。次に、ミドルオーダートラバーサルでミドルオーダールートノードの位置を見つけることにより、左右の葉の分布を判断できます(中次走査、ルートノードの左葉はすべて左葉、すべて右葉は後ろにあります)。

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

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if len(preorder)==0:
            return
        root = TreeNode(preorder[0])  # 根节点肯定是前序遍历的第一个
        root_index = inorder.index(preorder[0])  # 返回中序遍历中根节点的位置,该位置之前全是左叶子,之后全是右叶子。注意前序和中序遍历序列中,左右叶子的长度肯定相同
        root.left = self.buildTree(preorder[1:root_index+1], inorder[:root_index])
        root.right = self.buildTree(preorder[root_index+1:], inorder[root_index+1:])
        return root

106.ミドルオーダーとポストオーダーからシーケンスをトラバースすることにより、バイナリツリーを構築します

二分木は、ツリーのミドルオーダートラバーサルとポストオーダートラバーサルに従って構築されます。

注意:

ツリーに重複する要素はないと想定できます。

たとえば、与えられた

インオーダートラバーサルinorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]のポストオーダートラバーサル
は次の二分木を返します。
ここに画像の説明を挿入します

106.問題解決のPythonコード:

アイデア:ポストオーダートラバーサルの最後の要素はルートノードである必要があります。次に、ミドルオーダートラバーサルでミドルオーダールートノードの位置を見つけることにより、左右の葉の分布を判断できます(中次走査、ルートノードの左葉はすべて左葉、すべて右葉は後ろにあります)。最後に、ポストオーダートラバーサルの分布は、ミドルオーダーの左右の葉の長さに従って判断されます(ポストオーダートラバーサルでは、すべての左の葉が左に分布し、すべての右の葉がすべてオンになります)権利)

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

class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> 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

おすすめ

転載: blog.csdn.net/weixin_44414948/article/details/114689398