JAVA 实现二叉树(链式存储结构)

 更新时间:2016年07月12日 16:20:45   投稿:lqh  
本篇文章主要介绍用JAVA 实现二叉树,并提供实例.对二叉树数据结构很好的学习实践,有需要的朋友可以参考下

二叉树的分类(按存储结构)

树的分类(按存储结构)

              顺序存储(用数组表示(静态二叉树))
      链式存储

一些特别的二叉根:

                                   完全二叉树,平衡二叉树(AVL),线索二叉树,三叉的(带父亲的指针)
            二叉搜索树或者叫二叉 查找树(BST)

 所用二叉树如下图所示:

 

二叉树的Java实现(链式存储结构)

class TreeNode {
  private int key = 0;
  private String data = null;
  private boolean isVisted = false;
  private TreeNode leftChild = null;
  private TreeNode rightChild = null;
  
  public TreeNode(){
    
  }
  public TreeNode(int key, String data){
    this.key = key;
    this.data = data;
    this.leftChild = null;
    this.rightChild = null;
  }
  public int getKey() {
    return key;
  }
  public void setKey(int key) {
    this.key = key;
  }
  public String getData() {
    return data;
  }
  public void setData(String data) {
    this.data = data;
  }
  public TreeNode getLeftChild() {
    return leftChild;
  }
  public void setLeftChild(TreeNode leftChild) {
    this.leftChild = leftChild;
  }
  public TreeNode getRightChild() {
    return rightChild;
  }
  public void setRightChild(TreeNode rightChild) {
    this.rightChild = rightChild;
  }
  public boolean isVisted() {
    return isVisted;
  }
  public void setVisted(boolean isVisted) {
    this.isVisted = isVisted;
  }
}

public class BinaryTree {

  private TreeNode root = null;

  public BinaryTree() {
    root = new TreeNode(1, "rootNode(A)");
  }
  public void createBinTree(TreeNode root){
    //手动的创建(结构如图所示)
    TreeNode newNodeB = new TreeNode(2,"B");
    TreeNode newNodeC = new TreeNode(3,"C");
    TreeNode newNodeD = new TreeNode(4,"D");
    TreeNode newNodeE = new TreeNode(5,"E");
    TreeNode newNodeF = new TreeNode(6,"F");
    root.setLeftChild(newNodeB);
    root.setRightChild(newNodeC);
    root.getLeftChild().setLeftChild(newNodeD);
    root.getLeftChild().setRightChild(newNodeE);
    root.getRightChild().setRightChild(newNodeF);
  }
  public boolean IsEmpty() {
    // 判二叉树空否
    return root == null;
  }

  public int Height() {
    // 求树高度
    return Height(root);
  }

  public int Height(TreeNode subTree) {
    if (subTree == null)
      return 0; //递归结束:空树高度为0
    else {
      int i = Height(subTree.getLeftChild());
      int j = Height(subTree.getRightChild());
      return (i < j) ? j + 1 : i + 1;
    }

  }

  public int Size() {
    // 求结点数
    return Size(root);
  }

  public int Size(TreeNode subTree) {
    if (subTree == null)
      return 0;
    else {
      return 1 + Size(subTree.getLeftChild())
          + Size(subTree.getRightChild());
    }
  }

  public TreeNode Parent(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.getLeftChild() == element
        || subTree.getRightChild() == element)
      //找到, 返回父结点地址
      return subTree;
    TreeNode p;
    //先在左子树中找,如果左子树中没有找到,才到右子树去找
    if ((p = Parent(subTree.getLeftChild(), element)) != null)
      //递归在左子树中搜索
      return p;
    else
      //递归在左子树中搜索
      return Parent(subTree.getRightChild(), element);

  }

  public TreeNode LeftChild(TreeNode element) {
    //返回左子树
    return (element != null) ? element.getLeftChild() : null;
  }

  public TreeNode RightChild(TreeNode element) {
    //返回右子树
    return (element != null) ? element.getRightChild() : null;
  }

  public TreeNode getRoot() {
    //取得根结点
    return root;
  }

  public void destroy(TreeNode subTree) {
    //私有函数: 删除根为subTree的子树
    if (subTree != null) {
      destroy(subTree.getLeftChild()); //删除左子树
      destroy(subTree.getRightChild()); //删除右子树
      //delete subTree;       //删除根结点
      subTree = null;
    }
  }

  public void Traverse(TreeNode subTree) {

    System.out.println("key:" + subTree.getKey() + "--name:"
        + subTree.getData());
    Traverse(subTree.getLeftChild());
    Traverse(subTree.getRightChild());
  }

  public void PreOrder(TreeNode subTree) {
    //先根
    if (subTree != null) {
      visted(subTree);
      PreOrder(subTree.getLeftChild());
      PreOrder(subTree.getRightChild());
    }
  }

  public void InOrder(TreeNode subTree) {
    //中根
    if (subTree != null) {
      InOrder(subTree.getLeftChild());
      visted(subTree);
      InOrder(subTree.getRightChild());
    }
  }

  public void PostOrder(TreeNode subTree) {
    //后根
    if (subTree != null) {
      PostOrder(subTree.getLeftChild());
      PostOrder(subTree.getRightChild());
      visted(subTree);
    }
  }
  public void LevelOrder(TreeNode subTree) {
     //水平遍边
  }
  public boolean Insert(TreeNode element){
    //插入
    return true;
  }
  public boolean Find(TreeNode element){
    //查找
    return true;
  }
  public void visted(TreeNode subTree) {
    subTree.setVisted(true);
    System.out.println("key:" + subTree.getKey() + "--name:"
        + subTree.getData());
  }

  public static void main(String[] args) {
    BinaryTree bt = new BinaryTree();
    bt.createBinTree(bt.root);
    System.out.println("the size of the tree is " + bt.Size());
    System.out.println("the height of the tree is " + bt.Height());
    System.out.println("*******先根(前序)[ABDECF]遍历*****************");
    bt.PreOrder(bt.root);
    System.out.println("*******中根(中序)[DBEACF]遍历*****************");
    bt.InOrder(bt.root);
    System.out.println("*******后根(后序)[DEBFCA]遍历*****************");
    bt.PostOrder(bt.root);
  }

}

 结果输出:
the size of the tree is 6
the height of the tree is 3
*******先根(前序)[ABDECF]遍历*****************
key:1--name:rootNode(A)
key:2--name:B
key:4--name:D
key:5--name:E
key:3--name:C
key:6--name:F
*******中根(中序)[DBEACF]遍历*****************
key:4--name:D
key:2--name:B
key:5--name:E
key:1--name:rootNode(A)
key:3--name:C
key:6--name:F
*******后根(后序)[DEBFCA]遍历*****************
key:4--name:D
key:5--name:E
key:2--name:B
key:6--name:F
key:3--name:C
key:1--name:rootNode(A)

 希望本文对学习JAVA程序设计的同学有所帮助。

相关文章

  • Spring Boot统一处理全局异常的实战教程

    Spring Boot统一处理全局异常的实战教程

    最近在做项目时需要对异常进行全局统一处理,所以下面这篇文章主要给大家介绍了关于Spring Boot统一处理全局异常的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • 理解Java多线程之并发编程

    理解Java多线程之并发编程

    这篇文章主要介绍了理解Java多线程之并发编程的相关资料,需要的朋友可以参考下
    2023-02-02
  • springboot 运行 jar 包读取外部配置文件的问题

    springboot 运行 jar 包读取外部配置文件的问题

    这篇文章主要介绍了springboot 运行 jar 包读取外部配置文件,本文主要描述linux系统执行jar包读取jar包同级目录的外部配置文件,主要分为两种方法,每种方法通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • Java 关键字static详解及实例代码

    Java 关键字static详解及实例代码

    这篇文章主要介绍了Java 关键字static详解及实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • 老生常谈spring boot 1.5.4 日志管理(必看篇)

    老生常谈spring boot 1.5.4 日志管理(必看篇)

    下面小编就为大家带来一篇老生常谈spring boot 1.5.4 日志管理(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Vue中computed计算属性和data数据获取方式

    Vue中computed计算属性和data数据获取方式

    这篇文章主要介绍了Vue中computed计算属性和data数据获取方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • eclipse汉化及jdk安装环境配置超详细教程(Java安装教程)

    eclipse汉化及jdk安装环境配置超详细教程(Java安装教程)

    这篇文章主要介绍了eclipse汉化及jdk安装环境配置超详细教程(Java安装教程),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Idea如何去除Mapper警告方法解析

    Idea如何去除Mapper警告方法解析

    这篇文章主要介绍了Idea如何去除Mapper 警告的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • idea修改maven模块名称还显示老名称问题解决

    idea修改maven模块名称还显示老名称问题解决

    本文主要介绍了idea修改maven模块名称还显示老名称问题解决,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • mybatis <foreach>标签动态增删改查方式

    mybatis <foreach>标签动态增删改查方式

    这篇文章主要介绍了mybatis <foreach>标签动态增删改查方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论