JAVA数据结构——二叉树

树:

树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。

二叉树:

如图,树的一种特殊的形式,他只有两个分支,即左子树和右子树,则我们称这种特殊的树为二叉树。

二叉树的遍历方式:

简单的口诀:
      一、 先根遍历
      1. 访问根节点。
      2. 先根遍历左子树。
      3. 先根遍历右子树
      简称 中左右

      如图:A BD# CE#
  
      二、 中根遍历
      1. 中根遍历左子树
      2. 访问根节点
      3. 中根遍历右子树
      简称 左中右

      如图:DB# A EC#
     


      三、 后根遍历
      1. 中根遍历左子树
      2. 中根遍历右子树
      3. 访问根节点
      简称 左右中

      如图:D#B E#C A
      

把左子树看成前,根看成中,右子树看成后,遍历时把左右子树看成整体,进行遍历,是一种递归的过程。可以看的到,我中间加了空格,空格的意思就是分成三个整体部分,依次遍历得出结果。

代码实现:

package com.usts.edu.tree;

/**
 * Created by Guanzhong Hu
 * Date :2019/12/29
 * Description : 二叉树的链式存储结构
 * Version :1.0
 */
public class BiTreeNode {

    public Object data;

    public BiTreeNode lchild,rchild; // 左右孩子

    public BiTreeNode(){ // 空构造函数
        this(null);
    }

    public BiTreeNode(Object data){
        this(data,null,null);
    }

    public BiTreeNode(Object data,BiTreeNode lchild,BiTreeNode rchild){ // 赋值

        this.data = data;
        this.lchild = lchild;
        this.rchild = rchild;

    }
}
package com.usts.edu.tree;

/**
 * Created by Guanzhong Hu
 * Date :2019/12/29
 * Description : 二叉链式存储结构
 * Version :1.0
 */
public class BiTree {

    private BiTreeNode root; // 根节点

    private static int index = 0; // 用于记录先根遍历的索引值

    public BiTree() {
        this.root = null; // 初始化,根节点为空
    }

    public BiTree(BiTreeNode root) {
        this.root = root; // 生成第一棵树
    }

//    先跟遍历和中根遍历创建一颗二叉树
    public BiTree(String preOrder,String inOrder, int preIndex,int inIndex,int count){

        if (count>0){
            char r = preOrder.charAt(preIndex);
            int i = 0;
            for (;i<count;i++) {
                if (r == inOrder.charAt(i + inIndex)) break;
            }

            root = new BiTreeNode(r);
            root.lchild = new BiTree(preOrder,inOrder,preIndex+1,inIndex,i).root;
            root.rchild = new BiTree(preOrder,inOrder,preIndex+1+i,inIndex+i+1,count-i-1).root;
        }
    }

    /**
     * 遍历二叉树
     * -------------
     * 一、 先根遍历
     * 1. 访问根节点。
     * 2. 先根遍历左子树。
     * 3. 先根遍历右子树
     * 简称 中左右
     * -------------
     * 二、 中根遍历
     * 1. 中根遍历左子树
     * 2. 访问根节点
     * 3. 中根遍历右子树
     * 简称 左中右
     * -------------
     * 三、 后根遍历
     * 1. 中根遍历左子树
     * 2. 中根遍历右子树
     * 3. 访问根节点
     * 简称 左右中
     * -------------
     */
//    ==========递归执行遍历二叉树=============
//  先跟遍历 按方法一 执行
    public void preRootTraverse(BiTreeNode T){
        if (T!=null){
            System.out.println(T.data);
            preRootTraverse(T.lchild);
            preRootTraverse(T.rchild);
        }
    }
//   中跟遍历\/
    public void inRootTraverse(BiTreeNode T){
        if (T!=null){
            inRootTraverse(T.lchild);
            System.out.println(T.data);
            inRootTraverse(T.rchild);
        }
    }
//    后根遍历
    public void postRootTraverse(BiTreeNode T){
        if (T!=null){
            postRootTraverse(T.lchild);
            postRootTraverse(T.rchild);
            System.out.println(T.data);
        }
    }
//    ==========递归执行遍历二叉树=============

    public BiTreeNode getRoot(){
        return root;
    }

    public void setRoot(BiTreeNode root) {
        this.root = root;
    }
}
package com.usts.edu.tree;

/**
 * Created by Guanzhong Hu
 * Date :2019/12/29
 * Description :树的生成遍历测试类
 * Version :1.0
 */
public class TreeTest {
    public static void main(String[] args) {

        BiTree tree = createBiTree();
        BiTreeNode root = tree.getRoot();
        tree.postRootTraverse(root);
        tree.preRootTraverse(root);
    }
    public static BiTree createBiTree(){
        BiTreeNode d = new BiTreeNode("D");
        BiTreeNode g = new BiTreeNode("G");
        BiTreeNode h = new BiTreeNode("H");
        BiTreeNode e = new BiTreeNode("E",g,null);
        BiTreeNode b = new BiTreeNode("B",d,e);
        BiTreeNode f = new BiTreeNode("F",null,h);
        BiTreeNode c = new BiTreeNode("C",f,null);
        BiTreeNode a = new BiTreeNode("A",b,c);
        return new BiTree(a);
    }
}

gitee源码地址:

https://gitee.com/jockhome/data_structure

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值