【编程之美】java二进制实现重建
package com.cn.binarytree.utils; /**
* @author 刘利娟 liulijuan132@gmail.com
* @version 创建时间:2014年7月20日 下午2:03:30 类说明:
*/
class Node {
Node left;
Node right;
char chValue; Node(char chValue) {
left = null;
right = null;
this.chValue = chValue;
}
} public class Rebuild {
public static final int TREELEN = 6; // 树的节点数 void rebuild(char[] preOrder, char[] inOrder, int treeLen, Node root) {
if (preOrder == null || inOrder == null) { // 前序遍历序列或中序遍历序列为空
return;
}
Node temp = new Node(preOrder[0]);// 获取前序遍历序列的第一个节点
System.out.println("当前节点:" + preOrder[0]);
if (root == null) { // 假设根节点为空,则把当前节点复制给根节点
root = temp;
} if (treeLen == 1) {
return;
} int i = 0; while (i < inOrder.length) { // 在inOrder中找到与preOrder[0]相等的节点
if (preOrder[0] != inOrder[i]) {
i++;
} else {
break;
}
} int leftLen = i;
System.out.println("左子树长度:" + leftLen);
int rightLen = inOrder.length - leftLen - 1;
System.out.println("右子树长度:" + rightLen); if (leftLen > 0) {
for (int j = 0; j < preOrder.length - 1; j++) {
preOrder[j] = preOrder[j + 1];
}
char[] leftOrder = new char[leftLen];
System.out.print("左子树:");
for (int j = 0; j < leftLen; j++) {
leftOrder[j] = inOrder[j];
System.out.print(leftOrder[j] + "\t");
}
System.out.println();
rebuild(preOrder, leftOrder, leftLen, root.left);
}
if (rightLen > 0) {
for (int j = 0; j < preOrder.length - 1; j++) {
preOrder[j] = preOrder[j + 1];
}
char[] rightOrder = new char[rightLen];
System.out.print("右子树:");
for (int j = 0; j < rightLen; j++) {
rightOrder[j] = inOrder[j + leftLen + 1];
System.out.print(rightOrder[j] + "\t");
}
System.out.println();
rebuild(preOrder, rightOrder, rightLen, root.right);
}
} public static void main(String[] args) {
char[] pre = { 'a', 'b', 'd', 'c', 'e', 'f' };
char[] in = { 'd', 'b', 'a', 'e', 'c', 'f' };
new Rebuild().rebuild(pre, in, TREELEN, null);
} }
java实现重建二叉树:二叉树遍历序列和序列定序遍历,二进制重建。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
【编程之美】java二进制实现重建的更多相关文章
- [质疑]编程之美求N!的二进制最低位1的位置的问题
引子:编程之美给出了求N!的二进制最低位1的位置的二种思路,但是呢?但是呢?不信你仔细听我道来. 1.编程之美一书给出的解决思路 问题的目标是N!的二进制表示中最低位1的位置.给定一个整数N,求N!二 ...
- java并发编程之美-阅读记录1
1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的 ...
- Java并发编程系列-(5) Java并发容器
5 并发容器 5.1 Hashtable.HashMap.TreeMap.HashSet.LinkedHashMap 在介绍并发容器之前,先分析下普通的容器,以及相应的实现,方便后续的对比. Hash ...
- Java并发编程系列-(6) Java线程池
6. 线程池 6.1 基本概念 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数 ...
- java二进制表示形式与移位操作符
java二进制表示形式 java中数字的二进制表示形式称为"有符号的二进制补码",下面先介绍原码,反码,补码. 编码 计算方法 原码 用最高位表示符号位,'1'表示负号,'0'表示 ...
- 【编程之美】2.5 寻找最大的k个数
有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2 ...
- 【编程之美】CPU
今天开始看编程之美 .第一个问题是CPU的使用率控制,微软的问题果然高大上,我一看就傻了,啥也不知道.没追求直接看答案试了一下.发现自己电脑太好了,4核8线程,程序乱飘.加了一个进程绑定,可以控制一个 ...
- Java 二进制与十六进制转换
Java 二进制与十六进制转换 二进制转换十六进制 /** * @description 将二进制转换成16进制 * * @param buf * @return */ public static S ...
- 编程之美_1.1 让CPU占用率曲线听你指挥
听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...
随机推荐
- POJ训练计划2299_Ultra-QuickSort(归并排序求逆序数)
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 39279 Accepted: 14163 ...
- 【模式识别】Boosting
Boosting简单介绍 分类中通常使用将多个弱分类器组合成强分类器进行分类的方法,统称为集成分类方法(Ensemble Method).比較简单的如在Boosting之前出现Bagging的方法,首 ...
- java内存管理简析
作为java程序员,因为有虚拟机的自动内存管理,所以不需要再向C和C++程序员那样灾区写delete和free方法,但是java中是不是就不存在内存泄露问题呢,答案是否定的,java中一样存在内存泄漏 ...
- Win2003 Server磁盘配额揭密之启用篇
Win2003 Server磁盘配额揭密之启用篇 [ 作者:茶乡浪子 转贴自:it168.com 点击数:4973 更新时间:2005-1-17 ] 本文要向大家介绍如何利用W ...
- 树——axure线框图部件库介绍
终于到最后一个组件的介绍了!到这里基础的应用应该算完成了! 1. 拖动树组件,到页面编辑区域 2.添加节点,可以添加子节点也可以在该节点的前后添加平级节点 3. 编辑节点图标 做好上面的那一步, ...
- 在chrome中使用axure生成原型的问题
来自:非原型不设计
- GreenDao数据库结构升级
1.先用GreenDao工具类编写自动创建代码,按照升级后的最新数据库结构来编写 2.GreenDao工具自动生成的代码覆盖到项目里去 3.在项目里找到对应的自动生成的数据库DaoMaster类 在D ...
- MyBatis深入理解一
Mybatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .iB ...
- web前端网页开发一般过程
看见很多新手同学前端开发,效率比较慢.总是拿起代码就敲,不分析,没有逻辑,反而使效率变慢.所谓磨刀不误砍柴工,有一个良好的过程,才是最主要的: 1.分析平面效果图,在草稿纸上画出基本结构图 2.建立项 ...
- 设计模式六大原则(2):里氏替换原则(Liskov Substitution Principle)
肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.事实上原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:假设对每 ...