一、分析

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

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

二、代码

 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实现的更多相关文章

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

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

  2. 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历

    根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建.搜索.删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度 ...

  3. 二分法与二叉树的 Java 实现

    算法与数据结构始终是计算机基础的重要一环,今天我们来讨论下 Java 中二叉树的实现以及一些简单的小算法,如二分查找,归并排序等. 二分查找 二分查找是一种在有序数组中查找某一特定元素的搜索算法,它在 ...

  4. 二叉树的Java实现及特点总结

    二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树: ...

  5. 剑指offer面试题6 重建二叉树(java)

    注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...

  6. 【数据结构】之二叉树(Java语言描述)

    有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...

  7. 剑指Offer-22.从上往下打印二叉树(C++/Java)

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 分析: 按层次打印二叉树的节点,重点就是我们在打印一层节点的时候,同时按顺序保存好当前节点的下一层节点,也就是左节点和右节点,当此层节点 ...

  8. 剑指Offer-4.重建二叉树(C++/Java)

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2 ...

  9. 【LeetCode】101. Symmetric Tree 对称二叉树(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 [LeetCode] 题目地址 ...

  10. 轻松搞定面试中的二叉树题目(java&python)

    树是一种比较重要的数据结构,尤其是二叉树.二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒.二叉 ...

随机推荐

  1. Java中堆内存和栈内存详解【转】

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  2. Python学习笔记010——函数文档字符串

    函数文档字符串documentation string (docstring)是在函数开头,用来解释其接口的字符串.简而言之:帮助文档 包含函数的基础信息 包含函数的功能简介 包含每个形参的类型,使用 ...

  3. 搭建Go调试环境(LiteIDE)

                安装及配置LiteIDE 将 liteidex32.1.windows-qt5.zip解压到D:\即完成安装.   设置编辑环境 查看->编辑当前环境,确认GOROOT变 ...

  4. LevelDB场景分析2--Open

    1.源码 1 Status DB::Open(const Options& options, const std::string& dbname,      uint64_t new_ ...

  5. UHF RFID编码之TPP编码

    GB/T 39768通信交互模型 读写器使用TPP对基带数据进行编码,使用DSB-ASK或者SSB-ASK方式调制射频载波,向一个或者多个标签发送命令.命令发送后,读写器继续发送未经调制的射频载波,并 ...

  6. JavaScript / Html 转 pdf、图片

    Javascript 将 HTML 页面生成 PDF html2canvas: https://github.com/niklasvh/html2canvas jsPDF: https://githu ...

  7. appserv - 最简单的绑定路径

    补充:此方法比较low. 推荐伪静态:http://www.cnblogs.com/CyLee/p/5544119.html 找到路径C:\AppServ\Apache24\conf\httpd.co ...

  8. mvn test 执行testng测试用例

    maven项目,把testng用例防止test目录下,配置pom.xml 文件如下,执行mvn test 能自动执行testng里面的用例 <project xmlns="http:/ ...

  9. ui-router路由控制器(一)

    angularUI 在不断发展过程中已经被划分成了几个模块,你可以选择你需要的模块载入,我们今天要了解一下路由控制器 ui-router ,它就是angularUI划分出出来的一个独立模块. 此模块只 ...

  10. 【Android】5.5 状态切换(Switch)和评级条(RatingBar)

    分类:C#.Android.VS2015: 创建日期:2016-02-07 一.简介 1.利用Switch或者ToggleButton切换状态 如果只有两种状态,可以用ToggleButton控件或S ...