【编程之美】java实现重建二叉树

package com.cn.binarytree.utils;

/**
 * @author 刘利娟 [email protected]
 * @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实现重建二叉树,布布扣,bubuko.com

时间: 2024-10-15 08:44:07

【编程之美】java实现重建二叉树的相关文章

编程之美——3.8求二叉树中结点的最大距离(树,递归,动态规划)

<编程之美>读书笔记12: 3.8 求二叉树中节点的最大距离 问题: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 实际上就是求树的直径.若采用“动态规划方法”思想,会将该问题分解成“具有最大距离两点间的路径是否经过根节点”两个子问题,然后再对这两个子问题求解判断.实际上,不必这么麻烦.距离最远的两点必然在以某个节点A为根的子树上,它们间的路径必然经过该子树的根节

【编程之美】java二进制实现重建

package com.cn.binarytree.utils; /** * @author 刘利娟 [email protected] * @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 cla

编程之美-分层遍历二叉树

问题:给定一个二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号.那么分层遍历如图的二叉树,正确的输出应该为: <span style="font-size:14px;">1 2 3 4 5 6 7 8</span> 书中还给出了问题2:打印二叉树中的某层次的节点(从左到右),其中根结点为第0层,成功返回true,失败返回false 分析与解法 关于二叉树的问题,由于其本身固有的

编程之美问题之二叉树层序遍历多种解法

二叉树的层序遍历(要求区分层,例如每层遍历完输出换行) 单单层序遍历非常简单,一个队列就搞定了,但是区分层则要麻烦些.总的思路无非就是在每次print的时候,要能通过某个东西 区分出当前节点是否是一层最后一个节点,或者下一层的最后一个节点,感觉有点类似于机器学习中找个区分度明显的特征: 1.自己的解法,在单队列基础上,输入队列的数据添加一个标志 ,LevelHeaded,同时,在后面插入两个孩子的时候,判断是否这次输出的是队头,如果是的话,先插 个队头标志,再插入孩子,而且插入一次之后,后面不能

Pro 6 重建二叉树(java)

注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 1 package com.xsf.SordForOffer; 2 3 import java.util.Arrays; 4 5 /*剑指offer第6个问题 6 根据前序和中序遍历来重建二叉树 7 */ 8 class BinaryTreeNode { 9 public int value; 10 public BinaryTreeNod

编程之美之求二叉树中节点的最大距离

题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 分析:树上分析的很清楚,计算一个二叉树的最大距离有两个情况: 1. 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 2. 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 但是树上的代码使用了额外的节点字段,这里给出我的代码,思路是一样的: struct BinaryTree { int valu

《Java并发编程之美》(翟陆续著)高清pdf

<Java并发编程之美> 阿里巴巴技术专家力作,用代码说话.用实例验证,并发编程没有这么难!<Java并发编程的艺术>*作者方腾飞老师好评推荐! ? 百度网盘链接: https://pan.baidu.com/s/12oEEeDEO_YofImkpQA1bLA 提取码: pmkh  内容简介  · · · · · · 并发编程相比 Java 中其他知识点的学习门槛较高,从而导致很多人望而却步.但无论是职场面试,还是高并发/ 高流量系统的实现,却都离不开并发编程,于是能够真正掌握并发

java并发编程之美-阅读记录1

1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的一个执行路径,一个进程中至少会有一个线程,进程中的多个线程共享进程的资源. 线程:是cpu分配的基本单位. 由上图可看出,一个进程中会有多个线程,多个线程共享堆和方法区,但是每一个线程都会有自己的栈和程序计数器. 为什么要将栈和程序计数器设置为线程私有的呢? 前边说线程是cpu执行的基本单位,而cp

剑指Offer_编程题之重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 原文地址:https://www.cnblogs.com/yuqiujie/p/9051667.html