重建二叉树
问题描述
分析与解法
用java实现的代码如下:
1 package chapter3jiegouzhifa.RebuildBinTree; 2 3 /** 4 * 重建二叉树 5 * 递归解法 6 * @author DELL 7 * 8 */ 9 public class RebuildBinTree { 10 //定义节点类 11 public static class Node{ 12 int left; //左子树位置 13 int right; //右子树位置 14 char value; //节点值 15 public Node(int left, int right, char value){ 16 this.left = left; 17 this.right = right; 18 this.value = value; 19 } 20 public void setLeft(int left) { 21 this.left = left; 22 } 23 public void setRight(int right) { 24 this.right = right; 25 } 26 } 27 /** 28 * 重建二叉树 29 * @param preOrder 前序遍历结果 30 * @param inOrder 中序遍历结果 31 * @param tree 重建的树 32 * @param root 当前重建树的根节点位置 33 */ 34 public static void rebuild(String preOrder, String inOrder, Node[] tree, int root){ 35 36 int nTreeLen = preOrder.length(); 37 //检查边界条件 38 if(preOrder.length()==0||inOrder.length()==0) 39 return ; 40 //获取当前遍历的第一个节点 41 Node temp = new Node(-1,-1,preOrder.charAt(0)); 42 //如果节点为空,把当前节点复制到根节点 43 if(tree[root]==null){ 44 tree[root] = temp; 45 } 46 //如果当前树的长度为1,那么已经是最后一个节点 47 if(nTreeLen == 1){ 48 return ; 49 } 50 //寻找左子树的结尾 51 int i=0; 52 while(inOrder.charAt(i)!=temp.value&&i<nTreeLen){ 53 i++; 54 } 55 // System.out.println(i); 56 //重建左子树 57 int index = root; 58 if(i>0){ 59 tree[index].setLeft(++root); 60 Node left = new Node(-1,-1,preOrder.charAt(1)); 61 tree[root]=left; 62 // System.out.println(preOrder.substring(1,i+1)+" "+i); 63 rebuild(preOrder.substring(1,i+1),inOrder.substring(0, i),tree,root); 64 } 65 //重建右子树 66 if(nTreeLen-i-1>0){ 67 tree[index].setRight(root+i); 68 Node right = new Node(-1,-1,preOrder.charAt(i+1)); 69 tree[root+i] = right; 70 rebuild(preOrder.substring(i+1,nTreeLen),inOrder.substring(i+1, nTreeLen),tree,root+i); 71 } 72 } 73 public static void main(String[] args) { 74 String preOrder = "abdcef"; 75 String inOrder = "dbaecf"; 76 Node[] tree = new Node[preOrder.length()]; 77 rebuild(preOrder,inOrder,tree,0); 78 System.out.println("重建的树为:"); 79 for(int i=0;i<tree.length;i++){ 80 String left,right; 81 if(tree[i].left!=-1) 82 left = String.valueOf(tree[tree[i].left].value); 83 else 84 left = null; 85 if(tree[i].right!=-1) 86 right = String.valueOf(tree[tree[i].right].value); 87 else 88 right = null; 89 System.out.println(tree[i].value+" 左子树:"+left+" 右子树:"+right); 90 } 91 } 92 93 }
程序运行结果如下:
重建的树为: a 左子树:b 右子树:c b 左子树:d 右子树:null d 左子树:null 右子树:null c 左子树:e 右子树:f e 左子树:null 右子树:null f 左子树:null 右子树:null