简单二叉树的Java实现

一、二叉树的定义
一颗二叉树t是有限个元素的集合。当二叉树非空的时候,其中有一个元素称为根,余下的元素(如果有的话)被划分成两棵二叉树,分别称为t的左子树和右子树。
二叉树和树的根本区别:

  • 二叉树的每个元素都恰好有两棵子树(其中一个或两棵可能为空)。而数的每个元素可以有任意数量的子树。
  • 在二叉树中,每个元素的子树都是有序的,有左子树和右子树之分。树的子树是无序的。

二、二叉树的描述
二叉树最常用的表示方法是链式描述。每个元素用一个结点表示,结点有两个指针(引用)域,一个数据域。

    private static class BinaryNode { //二叉树节点类
        int element;        //节点包含的 元素
        BinaryNode left;//左孩子
        BinaryNode right;//右孩子
        BinaryNode(int element, BinaryNode left, BinaryNode right){
            this.element = element;
            this.left = left;
            this.right = right;
        }

        BinaryNode(int element){
            this(element,null,null);
        }
    }
  • 从根节点开始,沿着left和right可以访问二叉树所有结点。一般没有由子节点指向父节点的指针,如有必要可自行加入。

三、二叉树的三种遍历方式的简要说明
每个节点的左子树在其右子树之前遍历。区别在于对每个节点的访问的时间不同。在前序遍历中,先访问一个结点,再访问该节点的左右子树;在中序遍历中,先访文一个节点的左子树,然后访问该节点,最后访问右子树。在后序遍历中,先访问一个节点的左右子树,再访问该节点
代码如下:

package main;

public class BinaryTree {

    private static class BinaryNode { //二叉树节点类(内部类)
        int element;        //节点包含的 元素
        BinaryNode left;//左孩子
        BinaryNode right;//右孩子
        BinaryNode(int element, BinaryNode left, BinaryNode right){
            this.element = element;
            this.left = left;
            this.right = right;
        }

        BinaryNode(int element){
            this(element,null,null);
        }
    }

    private BinaryNode root;
    private int size;
    public BinaryTree(){
        root = null;
        size = 0;
    }
    public BinaryTree(int element){
        root = new BinaryNode(element);
        size = 1;
    }

    public void creatFullTree(){//手动建立一个完全二叉树,从上到下从左往右一次编号1~6
        if(size == 0){
            root = new BinaryNode(0);
            return;
        }
        root.left = new BinaryNode(1);
        root.right = new BinaryNode(2);
        root.left.left = new BinaryNode(3);
        root.left.right = new BinaryNode(4);
        root.right.left = new BinaryNode(5);
        root.right.right = new BinaryNode(6);
    }

    public void preOrder(BinaryNode p){
        if(p != null) {
            System.out.print(p.element + " ");
            preOrder(p.left);
            preOrder(p.right);
        }
    }

    public void inOrder(BinaryNode p){
        if(p != null) {
            inOrder(p.left);
            System.out.print(p.element + " ");
            inOrder(p.right);
        }
    }
    public void postOrder(BinaryNode p){
        if(p != null) {
            postOrder(p.left);
            postOrder(p.right);
            System.out.print(p.element + " ");
        }
    }

    public BinaryNode getRoot(){
        return this.root;
    }

    public static void main(String[] args) {
        BinaryTree BTree = new BinaryTree(0);
        BTree.creatFullTree();
        System.out.print("二叉树先序遍历序列:");
        BTree.preOrder(BTree.getRoot());
        System.out.println();
        System.out.print("二叉树中序遍历序列:");
        BTree.inOrder(BTree.getRoot());
        System.out.println();
        System.out.print("二叉树后序遍历序列:");
        BTree.postOrder(BTree.getRoot());
    }
}

运行结果:
运行结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值