JAVA实现二叉树(简易版)

个人感觉二叉树的实现主要还是如何构造一颗二叉树。构造二叉树函数的设计方法多种多样。以下程序通过定义内部类来表示二叉树的结点,然后再实现了二叉树这种数据结构的一些基本操作。

package tree;

public class BinaryTree<E> {
    //为什么要用静态内部类?静态内部类中不能访问外部类的非静态成员
    public static class TreeNode{
//        E data;
        Object data;
        TreeNode left;
        TreeNode right;
        public TreeNode(){

        }
        public TreeNode(Object data){
            this.data = data;
        }
        //构造一个新节点,该节点以left节点为其左孩子,right节点为其右孩子
        public TreeNode(Object data, TreeNode left, TreeNode right){
            this.data = data;
            this.left = left;
            this.right = right;
        }
    }

    private TreeNode root;//实现二叉树的类的数据域,即根结点来表示二叉树

    public BinaryTree(){
        this.root = new TreeNode();
    }
    //以指定的根元素创建一颗二叉树
    public BinaryTree(E data){
        this.root = new TreeNode(data);
    }

    //为指定的结点添加子结点
    public TreeNode addNode(TreeNode parent, E data, boolean isLeft){
        if(parent == null)
            throw new RuntimeException("父节点为空,无法添加子结点");
        if(isLeft && parent.left != null)
            throw new RuntimeException("节点已经左子节点,添加失败");
        if(!isLeft && parent.right != null)
            throw new RuntimeException("节点已经有右子节点,添加失败");
        TreeNode newNode = new TreeNode(data);
        if(isLeft)
            parent.left = newNode;
        else
            parent.right = newNode;
        return newNode;
    }

    public boolean empty(){
        return root.data == null;//根据根元素判断二叉树是否为空
    }

    public TreeNode root(){
        if(empty())
            throw new RuntimeException("树空,无法访问根结点");
        return root;
    }

    public E parent(TreeNode node){
        return null;//采用二叉树链表存储时,访问父结点需要遍历整棵二叉树,因为这里不实现
    }

    //访问指定节点的左结点,返回的是其左孩子的数据域
    public E leftChild(TreeNode parent){
        if(parent == null)
            throw new RuntimeException("空结点不能访问其左孩子");
        return parent.left == null ? null : (E)parent.left.data;
    }
    public E rightChild(TreeNode parent){
        if(parent == null)
            throw new RuntimeException("空结点不能访问其右孩子");
        return parent.right == null ? null : (E)parent.right.data;
    }

    public int deep(){
        return deep(root);
    }
    private int deep(TreeNode node){
        if(node == null)
            return 0;
        else{
            int leftDeep = deep(node.left);
            int rightDeep = deep(node.right);
            int max = leftDeep > rightDeep ? leftDeep : rightDeep;
            return max + 1;
        }
    }
}
时间: 2025-01-07 02:28:54

JAVA实现二叉树(简易版)的相关文章

JAVA聊天室简易版1.0(多线程)(注释版)

客户端 35 tfTxt.addActionListener(new TFListener()); 光标点在输入框里敲回车的时候-->执行67actionPerformed(ActionEvent e)的方法,改方法把输入的东西发出去,当然再发出去以前要先执行connect. 要退出是先调用30disconnect()这个方法,首先断开连接 1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.IOException;

JAVA聊天室简易版

单线程. SERVER端 1 import java.io.IOException; 2 import java.net.*; 3 import java.io.*; 4 public class Chatserver { 5 6 7 8 public static void main(String[] args) { 9 boolean started=false; 10 ServerSocket ss=null;//初始化 11 Socket s=null; 12 DataInputStre

Java面试宝典2013版(超长版)

一. Java基础部分......................................................................................................2 1.一个".java"源文件里能否够包含多个类(不是内部类)?有什么限制?.....2 2.Java有没有goto?........................................................................

Java面试宝典2014版

一. Java基础部分......................................................................................................2 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?.....2 2.Java有没有goto?.......................................................................

Java面试宝典2017版

1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有没有goto? java中的保留字,现在没有在java中使用. 3.说说&和&&的区别. &和&&

简易版聊天系统实现 Socket VS NIO两种实现方式

说是简单聊天系统,压根不能算是一个系统,顶多算个雏形.本文重点不在聊天系统设计和实现上,而是通过实现类似效果,展示下NIO 和Socket两种编程方式的差异性.说是Socket与NIO的编程方式,不太严谨,因为NIO的底层也是通过Socket实现的,但又想不出非常好的题目,就这样吧. 主要内容 Socket方式实现简易聊天效果 NIO方式实现简易聊天效果 两种方式的性能对比 前言 预期效果,是客户端之间进行"广播"式聊天,类似于QQ群聊天.希望以后有机会,以此简易版为基础,不断演进,演

JAVA实现二叉树

树是编程中一种常用的数据结构.以前在学习数据结构时,总想着如何实际地实现出一颗二叉树出来,现在参考了<数据结构与算法分析 JAVA语言描述 第二版>之后,照着书中的例子实现了一颗二叉树,个人感觉书上面的二叉树实现操作比较复杂.下面将我学到的一些知识记录下来: 1,定义树的操作的基本接口,其中不包括插入或删除操作,因为这二种操作与树的结构相关.同时,接口中也不包括遍历操作,因为并不是每个应用都会用到遍历.我们可以定义返回一个迭代器的方法,由于树中有多种不同的遍历,树的类可以含有几个方法,每个方法

杭电2083(简易版之最短距离)

简易版之最短距离 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 2   Accepted Submission(s) : 2 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 寒假的时候,ACBOY要去拜访很多朋友,恰巧他所有朋友的家都

Android学习之路——简易版微信为例(三)

最近好久没有更新博文,一则是因为公司最近比较忙,另外自己在Android学习过程和简易版微信的开发过程中碰到了一些绊脚石,所以最近一直在学习充电中.下面来列举一下自己所走过的弯路: (1)本来打算前端(即客户端)和后端(即服务端)都由自己实现,后来发现服务端已经有成熟的程序可以使用,如基于XMPP协议的OpenFire服务器程序:客户端也已经有成熟的框架供我们使用,如Smack,同样基于XMPP协议.这一系列笔记式文章主要是记录自己学习Android开发的过程,为突出重点(Android的学习)