(Java)二分木を構築するOJ質問(LeetCode105は前順序と順序に従って二分木を構築し、LeetCode106は後順序と順序に従って二分木を構築します)

コンテンツ

1.事前順序と順序に従って二分木を構築します

2.ポストオーダーとインオーダーに従ってバイナリツリーを構築します


1.事前順序と順序に従って二分木を構築します

プレオーダーおよびインオーダートラバーサルに基づいてバイナリツリーを構築します

質問:ツリーのプレオーダーおよびインオーダートラバーサルを前提として inorder,、バイナリツリーを構築し、そのルートノードを返してください。

例えば:

上記のリンクをクリックしてトピックを表示できます。具体的な方法は次のとおりです。

分析:ルートノードはプレオーダートラバーサルから取得でき、フォローノードの左右のサブツリー部分はインオーダーから取得できます。バイナリツリーを構築するとき、プレオーダーからルートを見つけてから、最初に、ルートの左と右のサブツリー部分を順番に作成します。ルートノードを作成してから、ルートの左のサブツリーとルートの右のサブツリーをそれぞれ作成します。このプロセスは再帰であり、各再帰で、新しいルートを見つけるために。

注:プレオーダーシーケンスはroot --- left --- rightであるため、復元する場合はroot --- left --- rightであるため、index ++が確立され、indexがプレオーダーマークのルートになり、インデックスが開始されます。事前注文の最初から最後まで

具体的な手順:

1.プレオーダートラバーサルでルートを見つけます

2.順序どおりの走査でルートを見つけ、境界点をposでマークします。posの左と右の部分は、再帰的な左検索と再帰的な右検索です。

3.最初にルートノードを復元し、次にルートの左側のサブツリーを再帰的に復元し、次にルートの右側のサブツリーを再帰的に復元します

4.再帰的復元は、範囲を順序どおりの走査で割ったものに基づいています

参照コード:

class Solution {
    int index = 0;  //标记前序的根
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return reBuildTree(preorder,inorder,0,inorder.length);
    }
    public TreeNode reBuildTree(int[] preorder,int[] inorder,int left,int right){
        //递归返回条件
        if(index>=preorder.length || left>=right){
            return null;
        }
        int pos = left;
        //在中序中找根的位置
        while(pos < right){
            if(inorder[pos] == preorder[index]){
                break;
            }
            pos++;
        }
        TreeNode root = new TreeNode(preorder[index]);//还原根
        index++;
        root.left = reBuildTree(preorder,inorder,left,pos);//递归还原左
        root.right = reBuildTree(preorder,inorder,pos+1,right);//递归还原右
        return root;
    }
}

2.ポストオーダーとインオーダーに従ってバイナリツリーを構築します

ポストオーダーとインオーダーから二分木を構築する

質問:ツリーのインオーダートラバーサルとポストオーダートラバーサルに基づいてバイナリツリーを構築します。

例えば:

。 

上記のリンクをクリックしてトピックを表示できます。具体的な方法は次のとおりです。

分析:ポストオーダートラバーサルはルートノードを決定でき、インオーダートラバーサルはルートノードの左右のサブツリーを取得できるため、インオーダートラバーサル内のルートノードの位置も見つけて、posでマークしますこれらの2つの部分では、ルートの左側のサブツリーとルートの右側のサブツリーがそれぞれ再帰的に構築されます。

注:後続のトラバーサルはleft --- right --- rootであるため、復元時に逆方向に復元します。復元の順序は次のとおりです。root --- right --- left、つまりindex--が確立され、indexはルートに続くマークは、次の最後から最初に移動します

具体的な手順:

1.後続のトラバーサルからルートを見つけます

2.順序のルート位置を見つけ、posマークを使用して順序トラバーサルを2つの部分に分割します

3.posトークンの右側にあるルートの右側のサブツリーを再帰的に復元します

4.posトークンの左側にあるルートの左側のサブツリーを再帰的に復元します

参照コード:

class Solution {
    int index;  //标记后序遍历的根
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        index = postorder.length-1; //后续的根
        return reBuildTree(inorder,postorder,0,inorder.length);
    }
    public TreeNode reBuildTree(int[] inorder,int[] postorder,int left,int right){
        //递归返回条件
        if(index < 0 || left >= right){
            return null;
        }
        //在中序遍历中找到根的位置
        int pos = left;
        while(pos < right){
            if(postorder[index] == inorder[pos]){
                break;
            }
            pos++;
        }
        //还原根
        TreeNode root = new TreeNode(postorder[index]);
        index--;
        root.right = reBuildTree(inorder,postorder,pos+1,right); //还原根的右
        root.left = reBuildTree(inorder,postorder,left,pos);  //还原根的左
        return root;
    }
}

おすすめ

転載: blog.csdn.net/qq_58710208/article/details/121799006