您的位置:首页 > 其它

由前序和中序数组重建二叉树

2017-09-24 01:38 197 查看
1、重建二叉树

来源:牛客网

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

2、思路:先序第一个元素a为根节点,在中序数组中,a左边的元素为左子树,右边为右子树。左右子树放到递归中处理即可

3、代码:

private TreeNode conBinaryTreeByPreAndIn(TreeNode root, int[] pre, int[] in, int pre_start,
int pre_end, int in_start, int in_end) {

int i, in_pos = 0;
// 找到先序中第一个元素在中序中的下标pos
for (i = in_start; i <= in_end; i++) {
if (in[i] == root.val) {
in_pos = i;
break;
}
}
TreeNode leftNode = null, rightNode = null;
int left_num = in_pos-in_start;//左子树数目

// 当前根节点存在左子树
if (in_pos > in_start) {
leftNode = new TreeNode(pre[pre_start + 1]);
root.left = leftNode;
}
// 当前根节点存在右子树
if (in_pos < in_end) {
rightNode = new TreeNode(pre[pre_start+(left_num+1)]);
root.right = rightNode;
}

// 根节点左边子节点数大于1
if (in_pos - in_start > 1) {
conBinaryTreeByPreAndIn(leftNode, pre, in, pre_start + 1, pre_start + left_num,
in_start , in_pos - 1);
}
// 根节点右边子节点数大于1
if (in_end - in_pos > 1) {
conBinaryTreeByPreAndIn(rightNode, pre, in, pre_start + left_num + 1, pre_end,
in_pos + 1, in_end);
}
return root;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: