JAVA二叉树,给出先序遍历和中序遍历,构造出新的二叉树
2016-05-14 23:04
507 查看
注意点;
1.确定整棵二叉树的根节点即先序遍历中的第一个元素root
2.确定root在中序遍历元素的位置,root左边的元素为二叉树的左子树元素Lchild,右边为右子树元素Rchild
3.在先序遍历中找到最先出现Lchild中元素的那个元素,为Lchild的根节点——root的左孩子节点,同理找出Rchild的根节点——root的右孩子节点
4.重复2,3步骤直至二叉树构建完成;
代码如下:
package offer.fkr.A;
//利用先序遍历和中序遍历重新构建二叉树;
// Definition for binary tree
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class reConstructBinaryTree {
//重新构建二叉树
public static TreeNode reConstructBinaryTree1(int [] pre,int [] in) {//pre先序遍历,in中序遍历
if(pre.length == 0 || in.length == 0 || pre.length != in.length){
return null;
}//如果没有遍历,或者遍历不一致,则返回为null
TreeNode root = new TreeNode(pre[0]);//定义二叉树的根节点
int i = 0;
while(in[i] != pre[0]){//找到根节点再中序遍历里的位置,
i++;
}
// 中序遍历中,根节点左侧为左子树节点,右侧为右子树节点
int [] preLeft = new int[i];//左子树先序遍历
int [] inLeft = new int[i]; //左子树中序遍历
int [] preRight = new int[pre.length - i - 1];//右子树先序遍历
int [] inRight = new int[in.length - i - 1];//右子树中序遍历
for(int j = 0;j<in.length;j++){
if(j < i){
preLeft[j] = pre[j+1];
inLeft[j] = in[j];
}else if(j > i){
preRight[j-i-1] = pre[j];
inRight[j-i-1] = in[j];
}
}
root.left = reConstructBinaryTree1(preLeft,inLeft);//递归构建左子树
root.right = reConstructBinaryTree1(preRight,inRight);//递归构建右子树
return root;//返回重新构建二叉树
}
public static void last(TreeNode tr){//后序遍历遍历二叉树
if(tr == null){
return ;
}
last(tr.left);
last(tr.right);
System.out.print(tr.val+" ");
}
public static void main(String[] args) {
int[] a = {1,2,4,7,3,5,6,8};
int[] b = {4,7,2,1,5,3,8,6};
TreeNode root = reConstructBinaryTree1(a,b);
last(root);
System.out.println();
}
}
1.确定整棵二叉树的根节点即先序遍历中的第一个元素root
2.确定root在中序遍历元素的位置,root左边的元素为二叉树的左子树元素Lchild,右边为右子树元素Rchild
3.在先序遍历中找到最先出现Lchild中元素的那个元素,为Lchild的根节点——root的左孩子节点,同理找出Rchild的根节点——root的右孩子节点
4.重复2,3步骤直至二叉树构建完成;
代码如下:
package offer.fkr.A;
//利用先序遍历和中序遍历重新构建二叉树;
// Definition for binary tree
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class reConstructBinaryTree {
//重新构建二叉树
public static TreeNode reConstructBinaryTree1(int [] pre,int [] in) {//pre先序遍历,in中序遍历
if(pre.length == 0 || in.length == 0 || pre.length != in.length){
return null;
}//如果没有遍历,或者遍历不一致,则返回为null
TreeNode root = new TreeNode(pre[0]);//定义二叉树的根节点
int i = 0;
while(in[i] != pre[0]){//找到根节点再中序遍历里的位置,
i++;
}
// 中序遍历中,根节点左侧为左子树节点,右侧为右子树节点
int [] preLeft = new int[i];//左子树先序遍历
int [] inLeft = new int[i]; //左子树中序遍历
int [] preRight = new int[pre.length - i - 1];//右子树先序遍历
int [] inRight = new int[in.length - i - 1];//右子树中序遍历
for(int j = 0;j<in.length;j++){
if(j < i){
preLeft[j] = pre[j+1];
inLeft[j] = in[j];
}else if(j > i){
preRight[j-i-1] = pre[j];
inRight[j-i-1] = in[j];
}
}
root.left = reConstructBinaryTree1(preLeft,inLeft);//递归构建左子树
root.right = reConstructBinaryTree1(preRight,inRight);//递归构建右子树
return root;//返回重新构建二叉树
}
public static void last(TreeNode tr){//后序遍历遍历二叉树
if(tr == null){
return ;
}
last(tr.left);
last(tr.right);
System.out.print(tr.val+" ");
}
public static void main(String[] args) {
int[] a = {1,2,4,7,3,5,6,8};
int[] b = {4,7,2,1,5,3,8,6};
TreeNode root = reConstructBinaryTree1(a,b);
last(root);
System.out.println();
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树