安全性を証明するために、バイナリツリーのオファー再建

タイトル説明

そして、バイナリツリーの再構築の先行順走査でのバイナリツリーの先行順走査で結果を入力してください。仮定結果先行順トラバーサル順序と重複する数字の入力は無料です。入射例えばプレオーダートラバーサルシーケンス{1,2,4,7,3,5,6,8}及び{4,7,2,1,5,3,8,6}順序トラバーサル順序、及び再構成された二分木前リターン。

思考

私たちは、その者は、最初の桁トラバーサルシーケンスの前文に応じてルートを作成し、その後、行きがけ順にルートノードの場所を見つけてみましょう、先行順走査の最初のノードがツリーのルートであることを知って、左側のサブツリーのルートは右我々は左と右のサブツリーノードの数を決定することができるようにすることを、右のサブツリーで、残されています。フロントの左、右の部分木のノードと配列先行順走査順序の値を分割した後、その左右のサブツリーの各々に再帰的に構築することができます。

参照コード

public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        
        // 终止条件
        if (pre == null || pre.length == 0) {
            return null;
        }
        
        // 创建根节点
        TreeNode root = new TreeNode(pre[0]);
        
        // 获取到根节点在中序数组的索引
        int index = findIndex(pre, in);
        
        // 前序数组左子树的索引为[1, index + 1), 中序数组左子树的索引为[0, index)
        root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, index + 1), Arrays.copyOfRange(in, 0, index));

        // 前序数组右子树的索引为[index + 1, pre.length), 中序数组右子树的索引为[index + 1, in.length)
        root.right = reConstructBinaryTree(Arrays.copyOfRange(pre, index + 1, pre.length), Arrays.copyOfRange(in, index + 1, pre.length));
        
        return root;
    }
    
    private int findIndex(int [] pre, int [] in) {
        for (int i = 0; i < in.length; i++) {
            if (in[i] == pre[0]) {
                return i;
            }
        }
        return -1;
    }
}
リリース7件のオリジナルの記事 ウォンの賞賛0 ビュー1353

おすすめ

転載: blog.csdn.net/Incanus_/article/details/105241351