相关概念

  存储结构:

  1. 顺序存储结构:二叉树的顺序存储结构适用于完全二叉树,对完全二叉树进行顺序编号,通过二叉树的性质五(第1个结点为根结点,第i个结点的左孩子为第2i个结点,右孩子为第2i+1个结点)。
  2. 链式存储结构:一般情况下,采用链式存储结构来存储二叉树。每个结点有3个域:data、left、right。

  遍历:

  1. 先根次序:根->左->右。
  2. 中根次序:左->根->右。
  3. 后根次序:左->右->根。

  遍历算法:

  1. 递归
  2. 非递归:通过设立一个栈。

声明二叉树结点类

 /**
* Copyright 2016 Zhengbin's Studio.
* All right reserved.
* 2016年7月16日 上午8:19:15
*/
package Two; /**
* @author zhengbinMac
*
*/
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
/**
* 先根遍历
* @param p
*/
public void preorder(TreeNode p) {
if(p != null) {
System.out.print(p.val + " ");
preorder(p.left);
preorder(p.right);
}
}
/**
* 中根遍历
* @param p
*/
public void inorder(TreeNode p) {
if(p != null) {
preorder(p.left);
System.out.print(p.val + " ");
preorder(p.right);
}
}
/**
* 后根遍历
* @param p
*/
public void postorder(TreeNode p) {
if(p != null) {
preorder(p.left);
preorder(p.right);
System.out.print(p.val + " ");
}
}
}

声明二叉树类 和 由先根遍历与中根遍历构造二叉树

  建立一颗二叉树必须明确以下两点:

  1. 结点与双亲结点及孩子结点间的层次关系。
  2. 兄弟结点间的左右子树的顺序关系。

  先根次序或后根次序反映双亲与孩子结点的层次关系,中根次序反映兄弟结点间的左右次序。所以,已知先根和中根两种遍历序列,或中根和后根两种遍历序列才能够唯一确定一颗二叉树。而已知先根和后根两种遍历序列仍无法唯一确定一颗二叉树。

 /**
* Copyright 2016 Zhengbin's Studio.
* All right reserved.
* 2016年7月16日 上午9:30:01
*/
package Two; import java.util.Arrays; /**
* @author zhengbinMac
*
*/
public class Tree {
protected TreeNode root;
public Tree() {
root = null;
}
public Tree(int[] pre, int[] in) {
// root = reConstructBinaryTree(pre, in);
root = reConstructBinaryTree1(pre, in);
}
/**
* 先根次序
*/
public void preorderTraversal() {
System.out.println("先根次序遍历:");
if(root != null) {
root.preorder(root);
}
}
/**
* 中根次序
*/
public void inorderTraversal() {
System.out.println("中根次序遍历:");
if(root != null) {
root.inorder(root);
}
}
/**
* 后根次序
*/
public void postorderTraversal() {
System.out.println("后根次序遍历:");
if(root != null) {
root.postorder(root);
}
}
/**
* 通过先根遍历与中根遍历构造二叉树(1)
*/
public TreeNode reConstructBinaryTree1(int[] pre, int[] in) {
if(pre.length == 0 || in.length == 0) {
return null;
}
TreeNode p = new TreeNode(pre[0]);
for (int i = 0; i < in.length; i++) {
if(pre[0] == in[i]) {
p.left = reConstructBinaryTree1(Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(in, 0, i));
p.right = reConstructBinaryTree1(Arrays.copyOfRange(pre, i+1, pre.length), Arrays.copyOfRange(in, i+1, in.length));
}
}
return p;
}
/**
* 通过先根遍历与中根遍历构造二叉树(2)
*/
public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
if(pre == null || in == null) {
return null;
}
TreeNode p = null;
int first;
int n = pre.length;
int k = 0;
if(n > 0) {
// 取第一个为根
first = pre[0];
p = new TreeNode(first);
// 确定根结点在中根序列中的位置
for (int i = 0; i < in.length; i++) {
if(in[i] == first) {
k = i;
break;
}
}
// 左子树
int[] presubLeft = new int[k];
int[] insubLeft = new int[k];
// 先根
for (int i = 1, j = 0; i <= k; i++, j++) {
presubLeft[j] = pre[i];
}
// 中根
for (int i = 0, j = 0; i <= k-1; i++, j ++) {
insubLeft[j] = in[i];
}
p.left = reConstructBinaryTree(presubLeft, insubLeft);
// 右子树
int[] presubRight = new int[n-1-k];
int[] insubRight = new int[n-1-k];
// 先根
for (int i = k+1, j = 0; i <= n-1; i++,j++) {
presubRight[j] = pre[i];
}
// 中根
for (int i = k+1, j = 0; i <= n-1; i++,j++) {
insubRight[j] = in[i];
}
p.right = reConstructBinaryTree(presubRight, insubRight);
}
return p;
}
}

测试类

 /**
* Copyright 2016 Zhengbin's Studio.
* All right reserved.
* 2016年7月16日 上午9:27:40
*/
package Two; /**
* @author zhengbinMac
*
*/
public class Test { public static void main(String[] args) {
int[] pre = {1,2,4,3,5,6};
int[] in = {4,2,1,5,3,6};
Tree t = new Tree(pre, in);
t.inorderTraversal();
System.out.println();
t.postorderTraversal();
System.out.println();
t.preorderTraversal();
}
}

在线编程:

牛客网——《剑指Offer》-重建二叉树

数据结构——Java实现二叉树的更多相关文章

  1. 【数据结构】之二叉树的java实现

    转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...

  2. 数据结构(5):Java实现二叉树

    二叉树图: package com.test.Sort; import java.util.ArrayList; import java.util.LinkedList; public class B ...

  3. 【Java】 二叉树的遍历(递归与循环+层序遍历)

    在[Java] 大话数据结构(9) 树(二叉树.线索二叉树)一文中,已经实现了采用递归方法的前.中.后序遍历,本文补充了采用循环的实现方法.以及层序遍历并进行了一个总结. 递归实现 /* * 前序遍历 ...

  4. Java实现二叉树及相关遍历方式

    Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(r ...

  5. java实现二叉树的Node节点定义手撕8种遍历(一遍过)

    java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...

  6. javascript数据结构与算法-- 二叉树

    javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...

  7. SDUT 3346 数据结构实验之二叉树七:叶子问题

    数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...

  8. SDUT 3345 数据结构实验之二叉树六:哈夫曼编码

    数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...

  9. SDUT 3340 数据结构实验之二叉树一:树的同构

    数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树 ...

随机推荐

  1. 执行脚本出现bin/bash: bad interpreter: No such file or directory

    -bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory VI打开文件,没发现任何问题, 把/bin/bash ...

  2. Java学习笔记之:Java 内部类

    一.介绍 内部类:存在与类中的类就是内部类,一般用于Android开发. 可以把内部类理解成一种继承关系 1.普通内部类 2.局部内部类 3.静态内部类 4.匿名内部类 二.笔记 1.普通内部类 /* ...

  3. MyBatis学习总结_11_MyBatis动态Sql语句

    MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...

  4. Java Map各遍历方式的性能比较

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的 ...

  5. Oracle ->> Oracle下实现SQL Server的TOP + APPLY

    今晚很好奇想知道Oracle下有没有APPLY子句?如果有那怎么实现SQL Server下的TOP + APPLY.结果自己写了个例子. with a as ( order by grp_factor ...

  6. HDU 4662 MU Puzzle 简单找规律

    没有任何变换(III变U和删UU操作)之前,I 的个数一定是2^x个(也就是2的整数次幂) 若仅考虑III变U,那么设U的个数为k,I 的个数变为2^x-3*k 再加上删除UU操作,假设我们删除了2* ...

  7. 第一个Linux驱动-流水灯【转】

    转自:http://www.xuebuyuan.com/1856562.html 水平有限,描述不当之处请指出,转载请注明出处http://blog.csdn.net/vanbreaker/artic ...

  8. MongoDB 学习笔记(一)基础篇

    1.MongoDB 特点 面向集合存储,存储对象类型的数据方便 模式自由,不需要定义任何模式(schma) 动态查询 完全索引,包含内部对象 复制和故障恢复方便 高效的二进制数据存储 支持c# 平台驱 ...

  9. Python3 学习第六弹: 迭代器与生成器

    1> 迭代器 迭代的意思类似递归一般,不断地对一个对象做重复的操作.来看个例子: class Fibs: def __init__(self): self.last = self.now = 1 ...

  10. R语言实战读书笔记(四)基本数据管理

    4.2 创建新变量 几个运算符: ^或**:求幂 x%%y:求余 x%/%y:整数除 4.3 变量的重编码 with(): within():可以修改数据框 4.4 变量重命名 包reshape中有个 ...