第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
相关文章推荐
- Crossing River
- Linux启动过程
- select的用法
- (七十二)自定义通知NSNotification实现消息传递
- Palindrome Transformation
- VIM Tutorial
- (七十二)自定义通知NSNotification实现消息传递
- oracle用户和表空间
- linux之配置IP地址
- ThreadPoolExecutor运转机制详解
- 怎样更健康解决一个人时的性需求
- leetcode83 Remove Duplicates from Sorted List
- poj1236 强连通分量+缩点
- Objective-C编码规范:26个方面解决iOS开发问题
- mysql或则oracle的declare可以放在操作语句的后面吗?
- Mac新手操作指南(五)
- java EE之jsp的7个动作指令 复习
- vimrc for windows
- AFNetworking2.0源码解析AFURLResponseSerialization
- 架构师速成6.6-知识的收集整理学习