您的位置:首页 > 其它

刷题之路----根据前序遍历和中序遍历或者后序遍历和中序遍历重建二叉树

2016-06-11 23:35 555 查看
题目如下:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

                        如以下树

1

2
3

4
5 6
7

前序遍历:1.根节点

2.前序遍历左子树

3.前序遍历右子树

中序遍历:1.中序遍历左子树

2.根节点

3.中序遍历右子树

后序遍历:1.后序遍历左子树

2.后序遍历右子树

3.根节点

所以上方树的

前序遍历为{1, 2, 4, 5, 3, 6, 7}

中序遍历为{4, 2, 5, 1, 6, 3, 7}

后序遍历为{4, 5, 2, 6, 7, 3, 1}

Java代码如下:

public TreeNode reConstructBinaryTree(int [] pre,int [] mid) {
TreeNode root = buildTree(pre, mid, 0, pre.length - 1, 0, pre.length - 1);
return root;
}
public static TreeNode buildTree(int[] off, int[] mid, int begin1, int end1, int begin2, int end2) {
if(begin1 > end1 || begin2 > end2) {
return null;
}
//找到根节点
int rootData = off[end1];
TreeNode head = new TreeNode(rootData);
//找到子树范围
int incount = findIndex(rootData, mid, begin2, end2);
int offset = incount - begin2 - 1;
TreeNode left = buildTree(off, mid, begin1, begin1 + offset, begin2, begin2 + offset);
TreeNode right = buildTree(off, mid, end1 - 1 - offset, end1 - 1, incount + 1, end2);
head.left = left;
head.right = right;
return head;
}
//在中序遍历下寻找根节点
public static int findIndex(int rootData, int[] mid, int begin2, int end2) {
for(int i = begin2; i <= end2; i++) {
if(mid[i] == rootData) {
return i;
}
}
return -1;
}

由后序遍历和中序遍历也能重建二叉树

Java代码如下:

public TreeNode reConstructBinaryTree(int [] off,int [] mid) {
TreeNode root = buildTree(off, mid, 0, off.length - 1, 0, off.length - 1);
return root;
}
public static TreeNode buildTree(int[] off, int[] mid, int begin1, int end1, int begin2, int end2) {
if(begin1 > end1 || begin2 > end2) {
return null;
}
//找到根节点
int rootData = off[end1];
TreeNode head = new TreeNode(rootData);
//找到子树范围
int incount = findIndex(rootData, mid, begin2, end2);
int offset = incount - begin2 - 1;
TreeNode left = buildTree(off, mid, begin1, begin1 + offset, begin2, begin2 + offset);
TreeNode right = buildTree(off, mid, end1 - 1 - offset, end1 - 1, incount + 1, end2);
head.left = left;
head.right = right;
return head;
}
//在中序遍历下寻找根节点
public static int findIndex(int rootData, int[] mid, int begin2, int end2) {
for(int i = begin2; i <= end2; i++) {
if(mid[i] == rootData) {
return i;
}
}
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: