タイトル説明
そして、バイナリツリーの再構築の先行順走査でのバイナリツリーの先行順走査で結果を入力してください。仮定結果先行順トラバーサル順序と重複する数字の入力は無料です。入射例えばプレオーダートラバーサルシーケンス{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;
}
}