【编程之美】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的占用率终会稳定 ...
随机推荐
- 安装DBMS_SHARED_POOL包
在安装10g gc的时候,会遇到The DBMS_SHARED_POOL package is not executed on the Existing Database这样的一个错误,意思是提示你D ...
- ubuntu安装Java jdk1.7.0
1.下载JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 2.解压 3. ...
- salon_百度百科
salon_百度百科 salon 编辑 是法语Salon一字的译音,中文意即客厅,原指法国上层人物住宅中的豪华会客厅.从十七世纪,巴黎的名人(多半是名媛贵妇)常把客厅变成著名的社交 ...
- [REST Jersey] @QueryParam Demo
This demo sourced from the jersey tutor. https://jersey.java.net/documentation/latest/jaxrs-resource ...
- [转]java开发环境搭建
分成两个部分: 1.下载安装jdk,并配置环境变量 链接:http://www.runoob.com/java/java-environment-setup.html 2.安装Eclipse 链接:h ...
- 认识axure组件区域
组件区域也叫做部件区域,英文为widgets,还有人称之为控件区域,组件是axure事先准备好的网站项目常用的零件,比如一些基本的页面元素 Axure默认存在2个组件库,分别为线框图和流程图.同时我们 ...
- GreenDao数据库结构升级
1.先用GreenDao工具类编写自动创建代码,按照升级后的最新数据库结构来编写 2.GreenDao工具自动生成的代码覆盖到项目里去 3.在项目里找到对应的自动生成的数据库DaoMaster类 在D ...
- HTTP协议和web工作原理
本章学完之后能干什么? 要把 知识点学好,那就需要把它相关的周边知识点了解全面 HTTP协议是web学习的核心!!! 学东东切忌只学配置,不学原理:只学会框架有什么用,要会自己写框架!! web学习直 ...
- [置顶] 无名管道的C++封装
xpipe-无名管道的C++封装类 无名管道的C++封装类,用于父子进程进行通信 基础介绍 unix下一切皆文件,管道也不例外.无名管道pipe定义在<unistd.h>中. #inclu ...
- 一些实用的mysql语句(不断积累更新)
1.数据表里仅仅有生日字段,想计算出其年龄的mysql语句: SELECT *,DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW( ))-TO_DAYS(生日字段)),'%Y')+0 ...