数据结构——Java实现二叉树
相关概念
存储结构:
- 顺序存储结构:二叉树的顺序存储结构适用于完全二叉树,对完全二叉树进行顺序编号,通过二叉树的性质五(第1个结点为根结点,第i个结点的左孩子为第2i个结点,右孩子为第2i+1个结点)。
- 链式存储结构:一般情况下,采用链式存储结构来存储二叉树。每个结点有3个域:data、left、right。
遍历:
- 先根次序:根->左->右。
- 中根次序:左->根->右。
- 后根次序:左->右->根。
遍历算法:
- 递归
- 非递归:通过设立一个栈。
声明二叉树结点类
/**
* 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 + " ");
}
}
}
声明二叉树类 和 由先根遍历与中根遍历构造二叉树
建立一颗二叉树必须明确以下两点:
- 结点与双亲结点及孩子结点间的层次关系。
- 兄弟结点间的左右子树的顺序关系。
先根次序或后根次序反映双亲与孩子结点的层次关系,中根次序反映兄弟结点间的左右次序。所以,已知先根和中根两种遍历序列,或中根和后根两种遍历序列才能够唯一确定一颗二叉树。而已知先根和后根两种遍历序列仍无法唯一确定一颗二叉树。
/**
* 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();
}
}
在线编程:
数据结构——Java实现二叉树的更多相关文章
- 【数据结构】之二叉树的java实现
转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...
- 数据结构(5):Java实现二叉树
二叉树图: package com.test.Sort; import java.util.ArrayList; import java.util.LinkedList; public class B ...
- 【Java】 二叉树的遍历(递归与循环+层序遍历)
在[Java] 大话数据结构(9) 树(二叉树.线索二叉树)一文中,已经实现了采用递归方法的前.中.后序遍历,本文补充了采用循环的实现方法.以及层序遍历并进行了一个总结. 递归实现 /* * 前序遍历 ...
- Java实现二叉树及相关遍历方式
Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(r ...
- java实现二叉树的Node节点定义手撕8种遍历(一遍过)
java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...
- javascript数据结构与算法-- 二叉树
javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...
- SDUT 3346 数据结构实验之二叉树七:叶子问题
数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...
- SDUT 3345 数据结构实验之二叉树六:哈夫曼编码
数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...
- SDUT 3340 数据结构实验之二叉树一:树的同构
数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树 ...
随机推荐
- Linux中ping命令
Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...
- ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 区别
ScriptManager.RegisterStartupScript方法 如果页面中不用Ajax,cs中运行某段js代码方式可以是: Page.ClientScript.RegisterStartu ...
- hibernate中openSession()跟getCurrentSession()方法之间的区别
Hibernate openSession() 和 getCurrentSession的区别 getHiberanteTemplate .getCurrentSession和OpenSession 采 ...
- 在MAC中安装XMPP服务器
一.安装MySQL 1.下载安装包
- SQL Server ->> Msg 7411, Level 16, State 1, Line 1 -- Server 'XXXX' is not configured for RPC.
关于问题,有两个相关的服务器选项. exec sp_serveroption @server='CIA-SH-SVR-SIS', @optname='rpc', @optvalue='true' ex ...
- Partitioner
partitioner 是map中的数据映射到不同的reduce时的根据.一般情况下,partitioner会根据数据的key来把数据平均分配给不同的reduce,同时保证相同的key分发到同一个re ...
- JAVASCRIPT和JQUERY判断浏览器信息总汇(备忘)
<script type="text/javascript"> //jquery判断浏览器信息 $(function(){ ...
- jquerymobile UI使用
<!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- Linux守护进程详解(init.d和xinetd) [转]
一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台 的守护进程来执行的 ...
- Java安全编码之用户输入
0x00 安全引言 1.传统Web应用与新兴移动应用 (1)传统Web应用:浏览器 HTTP 服务器(2)新兴移动应用:APP HTTP 服务器 从安全角度看,传统Web应用与新兴移动应用没有本质区别 ...