刷题之路----根据前序遍历和中序遍历或者后序遍历和中序遍历重建二叉树
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;
}
如以下树
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;
}
相关文章推荐
- MVC模式
- HDU 4542 小明系列故事——未知剩余系(反素数+最小的n使得n的约数为n-k(k已知))
- java的File
- 数据库组合查询练习1
- 在spring mvc中实现JSR303验证并将验证结果传回给视图层
- php 传址
- pfsense 2.3企业应用-WEB管理向导
- Mongodb
- Valid Sudoku
- 语法分析的基本概念
- 解决Spring定时计划任务重复执行两次(实例被构造两次)问题的方法
- 电梯调度算法 summary
- hdu5288 区间个数
- 关于QT连接数据库程序的发布问题
- AVL树
- 大道至简阅读笔记01
- 空中网线程题(3题)
- 群控电梯调度算法
- oracle第三章复习
- 分析binutils之addr2line