您的位置:首页 > 其它

第3章 结构之法——重建二叉树

2015-07-16 21:55 543 查看

重建二叉树

问题描述





分析与解法







用java实现的代码如下:

package chapter3jiegouzhifa.RebuildBinTree;

/**
* 重建二叉树
* 递归解法
* @author DELL
*
*/
public class RebuildBinTree {
//定义节点类
public static class Node{
int left;  //左子树位置
int right;  //右子树位置
char value;  //节点值
public Node(int left, int right, char value){
this.left = left;
this.right = right;
this.value = value;
}
public void setLeft(int left) {
this.left = left;
}
public void setRight(int right) {
this.right = right;
}
}
/**
* 重建二叉树
* @param preOrder 前序遍历结果
* @param inOrder    中序遍历结果
* @param tree    重建的树
* @param root  当前重建树的根节点位置
*/
public static void rebuild(String preOrder, String inOrder, Node[] tree, int root){

int nTreeLen = preOrder.length();
//检查边界条件
if(preOrder.length()==0||inOrder.length()==0)
return ;
//获取当前遍历的第一个节点
Node temp = new Node(-1,-1,preOrder.charAt(0));
//如果节点为空,把当前节点复制到根节点
if(tree[root]==null){
tree[root] = temp;
}
//如果当前树的长度为1,那么已经是最后一个节点
if(nTreeLen == 1){
return ;
}
//寻找左子树的结尾
int i=0;
while(inOrder.charAt(i)!=temp.value&&i<nTreeLen){
i++;
}
//        System.out.println(i);
//重建左子树
int index = root;
if(i>0){
tree[index].setLeft(++root);
Node left = new Node(-1,-1,preOrder.charAt(1));
tree[root]=left;
//            System.out.println(preOrder.substring(1,i+1)+" "+i);
rebuild(preOrder.substring(1,i+1),inOrder.substring(0, i),tree,root);
}
//重建右子树
if(nTreeLen-i-1>0){
tree[index].setRight(root+i);
Node right = new Node(-1,-1,preOrder.charAt(i+1));
tree[root+i] = right;
rebuild(preOrder.substring(i+1,nTreeLen),inOrder.substring(i+1, nTreeLen),tree,root+i);
}
}
public static void main(String[] args) {
String preOrder = "abdcef";
String inOrder = "dbaecf";
Node[] tree = new  Node[preOrder.length()];
rebuild(preOrder,inOrder,tree,0);
System.out.println("重建的树为:");
for(int i=0;i<tree.length;i++){
String left,right;
if(tree[i].left!=-1)
left = String.valueOf(tree[tree[i].left].value);
else
left = null;
if(tree[i].right!=-1)
right = String.valueOf(tree[tree[i].right].value);
else
right = null;
System.out.println(tree[i].value+" 左子树:"+left+" 右子树:"+right);
}
}

}


程序运行结果如下:

重建的树为:
a 左子树:b 右子树:c
b 左子树:d 右子树:null
d 左子树:null 右子树:null
c 左子树:e 右子树:f
e 左子树:null 右子树:null
f 左子树:null 右子树:null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: