二叉树的java实现
一、分析
一个二叉树节点有三个部分,一个是指向左子树的部分,一个是指向右子树的部分,另外一个是数据部分。可以把这个节点抽象成一个节点对象,给对象有两个节点对象属性和一个数据属性。如下图:

一个二叉树有只有一个根节点,其余的都是根节点的直接或间接子节点。所以可以把二叉树抽象成一个对象,该对象有一个节点类型的数据,也就是用来保存根节点。如下图:

二、代码
package com.algorithms.treee; /**
* 二叉树
*/
public class BinaryTree
{
private TreeNode root;// 根节点 public BinaryTree()
{
} public BinaryTree(TreeNode root)
{
this.root = root;
} public TreeNode getRoot()
{
return root;
} public void setRoot(TreeNode root)
{
this.root = root;
} /**
* 定义节点
*/
private static class TreeNode
{
private String data = null;// 数据部分
private TreeNode left;// 左节点的引用
private TreeNode right;// 右节点的引用 public TreeNode()
{
} public TreeNode(String data, TreeNode left, TreeNode right)
{
this.data = data;
this.left = left;
this.right = right;
} public String getData()
{
return data;
} public void setData(String data)
{
this.data = data;
} public TreeNode getLeft()
{
return left;
} public void setLeft(TreeNode left)
{
this.left = left;
} public TreeNode getRight()
{
return right;
} public void setRight(TreeNode right)
{
this.right = right;
} } /**
* 返回父结点
*
* @param element
* @return
*/
public TreeNode getParent(TreeNode element)
{
return (root == null || root == element) ? null : parent(root, element);
} public TreeNode parent(TreeNode subTree, TreeNode element)
{
if (subTree == null)
return null;
if (subTree.getLeft() == element || subTree.getRight() == element)
// 返回父结点地址
return subTree;
TreeNode p;
// 现在左子树中找,如果左子树中没有找到,才到右子树去找
if ((p = parent(subTree.getLeft(), element)) != null)
// 递归在左子树中搜索
return p;
else
// 递归在右子树中搜索
return parent(subTree.getRight(), element);
} /**
* 节点个数
*
* @return
*/
public int getSize()
{
return getNum(root);
} private int getNum(TreeNode node)
{
if (node == null)
{
return 0;
}
else
{
int i = getNum(node.getLeft());
int j = getNum(node.getRight());
return j + i + 1;
}
} /**
* 树高度
*
* @return
*/
public int getHeight()
{
return getHeight(root);
} private int getHeight(TreeNode node)
{
if (node == null)
return 0;// 递归结束:空树高度为0
else
{
int i = getHeight(node.getLeft());
int j = getHeight(node.getRight());
return (i < j) ? (j + 1) : (i + 1);
}
} /**
* 前序遍历
*
* @param node
*/
public void preOrder(TreeNode node)
{
if (node != null)
{
System.out.println(node.getData());
preOrder(node.getLeft());
preOrder(node.getRight());
}
} /**
* 中序遍历
*
* @param node
*/
public void inOrder(TreeNode node)
{
if (node != null)
{
inOrder(node.getLeft());
System.out.println(node.getData());
inOrder(node.getRight());
}
} /**
* 后续遍历
*
* @param node
*/
public void postOrder(TreeNode node)
{
if (node != null)
{
postOrder(node.getLeft());
postOrder(node.getRight());
System.out.println(node.getData());
}
} public static void main(String[] args)
{ TreeNode l12 = new TreeNode("left12", null, null);
TreeNode r12 = new TreeNode("right12", null, null);
TreeNode l22 = new TreeNode("left22", null, null);
TreeNode r22 = new TreeNode("right22", null, null); TreeNode l1 = new TreeNode("left1", l12, r12);// 根节点左子树
TreeNode r1 = new TreeNode("right1", l22, r22);// 根节点右子树
TreeNode root = new TreeNode("root", l1, r1);// 创建根节点 BinaryTree bt = new BinaryTree(root);
System.out.println("=======先序遍历======");
bt.preOrder(bt.getRoot());
System.out.println("=======中序遍历======");
bt.inOrder(bt.getRoot());
System.out.println("========后续遍历=======");
bt.postOrder(bt.getRoot());
System.out.println("===========");
System.out.println(bt.getHeight());
System.out.println(bt.getSize()); System.out.println(bt.getParent(r22).getData());
}
}
二叉树的java实现的更多相关文章
- 【数据结构】之二叉树的java实现
转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...
- 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历
根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建.搜索.删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度 ...
- 二分法与二叉树的 Java 实现
算法与数据结构始终是计算机基础的重要一环,今天我们来讨论下 Java 中二叉树的实现以及一些简单的小算法,如二分查找,归并排序等. 二分查找 二分查找是一种在有序数组中查找某一特定元素的搜索算法,它在 ...
- 二叉树的Java实现及特点总结
二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树: ...
- 剑指offer面试题6 重建二叉树(java)
注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...
- 【数据结构】之二叉树(Java语言描述)
有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...
- 剑指Offer-22.从上往下打印二叉树(C++/Java)
题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 分析: 按层次打印二叉树的节点,重点就是我们在打印一层节点的时候,同时按顺序保存好当前节点的下一层节点,也就是左节点和右节点,当此层节点 ...
- 剑指Offer-4.重建二叉树(C++/Java)
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2 ...
- 【LeetCode】101. Symmetric Tree 对称二叉树(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 [LeetCode] 题目地址 ...
- 轻松搞定面试中的二叉树题目(java&python)
树是一种比较重要的数据结构,尤其是二叉树.二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒.二叉 ...
随机推荐
- Interface_GL通过gl_interface导入日记账(案例)
2014-06-17 BaoXinjian
- Template Method - 模板方法模式
1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...
- Go 语言官方包函数中文翻译
Go官方包函数中文翻译 *** import "strings" func Join(a []string, sep string) string Join concatenate ...
- DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2_SKIPINSERTED的使用
本文主要解释下DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2_SKIPINSERTED的使用 实验环境: DB2 v9.7.0.6 AIX 6.1 ...
- yield与send实现协程操作
yield与send实现协程操作 之前我们说过,在函数内部含有yield语句即称为生成器. 下面,我们来看看在函数内部含有yield语句达到的效果.首先,我们来看看以下代码: def foo(): w ...
- HDU--Elevator(水题)
Elevator nid=24#time"> Time Limit: 1000ms Memory limit: 32768K 有疑问?点这里^_^ 题目描写叙述 The high ...
- OpenGL cullface
opengl cullface是根据顶点顺逆时针来判断正反面的.而不是根据法线判断的.所以有可能法线是正确的,但cullface效果却是反的.
- JSON概述及其在JavaScript与Java中的应用(整理)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成. 官网:http://json.org/ ...
- [Python]南邮OJ代码备份爬虫
之前看过Python学习的经验,说以project为导向学习. 自己分析了一下,一般接触Python的都有一定的其它语言基础,对于程序设计的基本逻辑,语法都有一个大概的了解.而Python这样的脚本语 ...
- 【Android】3.18 示例18--自定义绘制功能
分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 简介:介绍自定义绘制点.线.多边形.圆等几何图形和文字 详述: (1)支持绘制凸多边形,如要绘制凹多边形请用三 ...