IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Java创建遍历二叉树(递归)并求树高及叶节点个数(代码全) -> 正文阅读

[数据结构与算法]Java创建遍历二叉树(递归)并求树高及叶节点个数(代码全)

在学习树的操作之后,我们就可以对数这种数据结构进行创建和使用了,话不多说,直接上代码

PS:为了代码复用和通用性,采用接口然后打包了整个工程,存储数据定义为泛型

一、接口及链结点定义

package BinaryTree;

public interface BinaryTreeInterface <T>{
    public void preOrder(LinkedNode node);//前序遍历
    public void inOrder(LinkedNode node);//中序遍历
    public void postOrder(LinkedNode node);//后序遍历
    public void levelOrder();//层序遍历
    public int countHigh(LinkedNode node);//输出树高
    public int countNum(LinkedNode node);//输出叶子结点个数
}

结点采用链表的方式?

package BinaryTree;

public class LinkedNode<T> {
    private LinkedNode<T> lChild;
    private LinkedNode<T> rChild;
    private T data;
    LinkedNode<T> next;

    public LinkedNode<T> getNext() {
        return next;
    }

    public void setNext(LinkedNode<T> next) {
        this.next = next;
    }

    public LinkedNode(T element){
        data = element;
    }

    public LinkedNode<T> getlChild() {
        return lChild;
    }

    public void setlChild(LinkedNode<T> lChild) {
        this.lChild = lChild;
    }

    public LinkedNode<T> getrChild() {
        return rChild;
    }

    public void setrChild(LinkedNode<T> rChild) {
        this.rChild = rChild;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

?

二、遍历

1.前序(递归)

@Override
    public void preOrder(LinkedNode node){
        if (node==null)
            return;
        else {
            System.out.print(node.getData()+" ");
            preOrder(node.getlChild());
            preOrder(node.getrChild());
        }
    }

2.中序(递归)

@Override
    public void inOrder(LinkedNode node){
        if (node==null)
            return;
        else {
            inOrder(node.getlChild());
            System.out.print(node.getData()+" ");
            inOrder(node.getrChild());
        }
    }

3.后序(递归)

@Override
    public void postOrder(LinkedNode node){
        if (node==null)
            return;
        else {
            postOrder(node.getlChild());
            postOrder(node.getrChild());
            System.out.print(node.getData()+" ");
        }
    }

?4.层序(队列)

这里多说一句,因为层序遍历的特性,采用队列的方式进行存储,所以我们这里提前定义一个队列类供其使用

package BinaryTree;

public class Queue<T> {
    private LinkedNode<T> frist = null;
    private LinkedNode<T> rear = null;
    public boolean isEmpty(){
        if(frist==null||rear==null)
            return true;
        return false;
    }
    public void enqueue(T element){
        LinkedNode node = new LinkedNode(element);
        if(isEmpty()){
            frist = node;
            rear = node;
        }
        else {
            rear.setNext(node);
            rear = node;
        }
    }
    public T outqueue(){
        if(isEmpty())
            throw new NullPointerException("队列为空");
        T ele = frist.getData();
        frist = frist.getNext();
        return ele;
    }
}
@Override
    public void levelOrder(){
        Queue<LinkedNode> queue = new Queue<LinkedNode>();
        if(root==null)
            return;
        else {
            queue.enqueue(root);//抽象理解为将一颗树加入到这个队列中
            while(!queue.isEmpty()){
                LinkedNode tempNode = queue.outqueue();
                System.out.print(tempNode.getData()+" ");
                if(tempNode.getlChild()!=null)
                    queue.enqueue(tempNode.getlChild());
                if (tempNode.getrChild()!=null)
                    queue.enqueue(tempNode.getrChild());
            }
        }
    }

三、创建二叉树(前序创建)

给定一个树的扩展序列(这里为前序)进行二叉树的创建,我们将虚结点定义为”#“

采用递归的方式进行创建

    public void creatTree(T[] tree){
        root = creatPreTree(tree);
    }
    private int elementCount = 0;
    public LinkedNode<T> creatPreTree(T[] tree){
        LinkedNode<T> node;
        elementCount++;//索引值,到数组中每一个我们需要添加的点
        if (elementCount > tree.length||tree[elementCount-1].equals("#"))
            node = null;
        else {
            node = new LinkedNode<T>(tree[elementCount-1]);
            node.setlChild(creatPreTree(tree));
            node.setrChild(creatPreTree(tree));
        }
        return node;
    }

四、求树高(深度)、叶节点的个数

**还是递归**

    @Override
    public int countHigh(LinkedNode node){
        if(node == null)
            return 0;
        else{
            int lhight = countHigh(node.getlChild());
            int rhight = countHigh(node.getrChild());
            return Math.max(lhight,rhight)+1;
        }
    }
    @Override
    public int countNum(LinkedNode node){
        if(node==null)
            return 0;
        if(node.getlChild()==null&&node.getrChild()==null){
            return 1;
        }
        return countNum(node.getlChild())+countNum(node.getrChild());
    }

最后

如这样一颗拓展二叉树

?

我们在主类中传入,输出它的遍历及深度、叶节点的个数验证代码

String[] str = {"A","B","C","#","#","D","E","#","G","#","#","F","#","#","#"};

?以上就是Java二叉树的相关操作,原创不易QAQ,如果对你有帮助的话点个赞再走吧 ~—~

欢迎评论区讨论~

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 16:14:34  更:2021-12-18 16:14:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:34:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码