二叉树的方法

目录

一、二叉树的定义

​编辑

二、二叉树的创建

三、二叉树的遍历

1、前序遍历

2、中序遍历

3、后序遍历

4、层序遍历

四、二叉树遍历方法的使用

五、二叉树的操作

1、节点的个数

2、叶子节点的个数

3、第k层节点的个数

4、二叉树的高度

5、检查值为value的元素是否存在


一、二叉树的定义

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分。

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点。


二、二叉树的创建

二叉树每个节点有自己的元素和左右孩子节点的地址,定义一个内部类来定义每个节点。

public class BinaryTree {


    static class TreeNode{

        public char val;

        public TreeNode left;

        public TreeNode right;


        public TreeNode(char val) {

            this.val = val;

        }

        public TreeNode creatTree(){

            TreeNode A=new TreeNode('A');

            TreeNode B=new TreeNode('B');

            TreeNode C=new TreeNode('C');

            TreeNode D=new TreeNode('D');

            TreeNode E=new TreeNode('E');

            TreeNode F=new TreeNode('F');

            TreeNode G=new TreeNode('G');

            TreeNode H=new TreeNode('H');


            A.left=B;

            A.right=C;

            B.left=D;

            B.right=E;

            C.left=F;

            C.right=G;

            E.right=H;


            return A;

        }

    }

三、二叉树的遍历

1、前序遍历

前序遍历:根-->根的左子树-->根的右子树

 void preorder(TreeNode root){

        if (root==null){

            return;

        }

        System.out.print(root.val+" ");


        preorder(root.left);

        preorder(root.right);

    }

2、中序遍历

中序遍历:根的左子树-->根-->根的右子树

void inorder(TreeNode root){

        if (root==null){

            return;

        }

        preorder(root.left);

        System.out.print(root.val);

        preorder(root.right);

    }

3、后序遍历

后序遍历:根的左子树-->根的右子树-->根

void postorder(TreeNode root){

            if (root==null){

                return;

            }

            postorder(root.left);

            postorder(root.right);

            System.out.print(root.val);

    }

4、层序遍历

将节点的值放入队列中,然后出队列。

 void levelorder(TreeNode root){

            if (root==null){

                return;

            }

        Queue<TreeNode>queue=new LinkedList<>();

            queue.offer(root);

            while (!queue.isEmpty()){

                TreeNode cur=queue.poll();

                System.out.print(cur.val+" ");

                
                if (cur.left!=null){

                    queue.offer(cur.left);

                }

                if (cur.right!=null){

                    queue.offer(cur.right);

                }

            }

    }

四、二叉树遍历方法的使用

定义一个Main方法

public class Main {

    public static void main(String[] args) {

        BinaryTree binaryTree=new BinaryTree();

        BinaryTree.TreeNode root=binaryTree.creatTree();


        //前序遍历

        binaryTree.preorder(root);
        System.out.println();


        //中序遍历
        binaryTree.inorder(root);
        System.out.println();


        //后序遍历
        binaryTree.postorder(root);
        System.out.println();


        //层序遍历
        binaryTree.levelorder(root);
        System.out.println();

    }

}

执行结果:

A B D E H C F G 
D B E H A F C G 
D H E B F G C A 
A B C D E F G H


五、二叉树的操作

1、节点的个数

遍历求节点个数

 public int usedSize;

    int getSize(TreeNode root){

        if (root==null){

            return 0;

        }

        usedSize++;

        getSize(root.left);

        getSize(root.right);

        return usedSize;

    }

子问题求节点个数

  int getSize1(TreeNode root){

        if (root==null){

            return 0;

        }

        return getSize1(root.left)+getSize1(root.right)+1;

    }

2、叶子节点的个数

当节点的左右子节点为空时,则该节点就是叶子节点。

遍历求叶子节点

 public int leafSize;

    int getLeafNodeCount(TreeNode root) {

        if (root == null) {

            return 0;

        }

        if (root.left == null && root.right == null) {

            leafSize++;

        }

            getLeafNodeCount(root.left);

            getLeafNodeCount(root.right);

            return leafSize;

        }

子问题求叶子节点

int getLeafNodeCount1(TreeNode root){

        if (root==null){

            return 0;

        }

        if (root.left==null&&root.right==null){

            return 1;

        }

        return getLeafNodeCount1(root.left)+getLeafNodeCount1(root.right);

        }

3、第k层节点的个数

 int getKUsedSize(TreeNode root,int k){

        if (root==null){

            return 0;

        }

        if (k==1){

            return 1;

        }

        return getKUsedSize(root.left,k-1)+getKUsedSize(root.right,k-1);

    }

4、二叉树的高度

 int getHight(TreeNode root){

        if (root==null){

            return 0;

        }

        int getleftHight=getHight(root.left);

        int getrightHight=getHight(root.right);


        return getleftHight > getrightHight ? getleftHight+1 : getrightHight+1;

    }

5、检查值为value的元素是否存在

 TreeNode findValue(TreeNode root,char value){

        if (root==null){

            return null;

        }

        if (root.val==value){

            return root;

        }

        TreeNode ret1=findValue(root.left,value);

        if (ret1!=null){

            return ret1;

        }

        TreeNode ret2=findValue(root.right,value);

        if (ret2!=null){

            return ret2;

        }

        return null;

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/753349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「2024抢先看」6款免费的ai变声器,助你开麦就变声

你是否也曾想模仿电视剧中的明星说话&#xff0c;或者想像泰勒一样有着独特的嗓音呢&#xff1f;通过免费版ai变声器&#xff0c;你可以轻松实现实时变声&#xff0c;将你的声音转换为专业且动听的声音&#xff0c;让身边的朋友对你刮目相看。在本文中&#xff0c;小编将分享20…

服务器日志事件ID4107:从自动更新 cab 中提取第三方的根目录列表失败,错误为: 已处理证书链,但是在不受信任提供程序信任的根证书中终止。

在查看Windows系统日志时&#xff0c;你是否有遇到过事件ID4107错误&#xff0c;来源CAPI2&#xff0c;详细信息在 http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab 从自动更新 cab 中提取第三方的根目录列表失败&#xff0c;…

简单的本地局域网的前后端接口联调

由于项目被赶进度了&#xff0c;急于前后端联调接口&#xff0c;但是我又没钱买服务器&#xff08;主要我也不会部署&#xff09;&#xff0c;所以我这里就紧急找一个后端的大神朋友请教了一下&#xff1a;苏泽SuZe-CSDN博客 提示&#xff1a;这里不讲后端怎么写接口、前端怎么…

C#——里氏转换详情

里氏转换 里氏转换就是派生类的对象赋值给父类对象&#xff0c;反之则不行 实例 : 先创键一个类然后继承 调用

双路视频同屏显示(拼接)-基于野火Zynq7020开发板

前情提要 米联客FDMA驱动OV5640摄像头—基于野火Zynq7020开发板 本文在此基础上&#xff0c;实现了双路视频拼接。将ov5640输出的1024600的图像数据缩放为512600&#xff0c;分两路写入ddr3&#xff0c;并且显示在1024*600的RGB屏幕中。 纯FPGA也可以按此方法实现。 总体BLOC…

【C++ 初阶路】--- 类和对象(末)

目录 一、const成员1.1 取地址及const取地址操作符重载 二、再谈构造函数2.1 构造函数体赋值2.2 初始化列表2.3 explicit关键字 三、static成员3.1 概念3.2 特性 四、友元4.1 友元函数4.2 友元类 五、内部类六、匿名对象 一、const成员 将const修饰的“成员函数”称之为const成…

Qt creator实现一个简单计算器

目录 1 界面设计 2 思路简介 3 代码 目录 1 界面设计 ​2 思路简介 3 代码 3.1 widget.h 3.2 widget.c 4 完整代码 在这里主要记载了如何使用Qt creator完成一个计算器的功能。该计算器可以实现正常的加减乘除以及括号操作&#xff0c;能实现简单的计算器功能。 1 界…

北京站圆满结束!MongoDB Developer Day上海站,周六见!

上周六 MongoDB Developer Day首站北京站 80位开发者与MongoDB一起度过了充实的一天 专题讲座➕动手实操➕专家面对面交流 从数据建模、进阶查询技巧 到Atlas搜索与向量搜索 让参会伙伴们直呼“满满的技术干货&#xff01;” 全体参会者与工作人员合影 MongoDB Developer …

【unity笔记】五、UI面板TextMeshPro 添加中文字体

Unity 中 TextMeshPro不支持中文字体&#xff0c;下面为解决方法&#xff1a; 准备字体文件&#xff0c;从Windows系统文件的Fonts文件夹里拖一个.ttf文件&#xff08;C盘 > Windows > Fonts &#xff09; 准备字库文件,新建一个文本文件&#xff0c;命名为“字库”&…

Vue组件化、单文件组件以及使用vue-cli(脚手架)

文章目录 1.Vue组件化1.1 什么是组件1.2 组件的使用1.3 组件的名字1.4 嵌套组件 2.单文件组件2.1 vue 组件组成结构2.1.1 template -> 组件的模板结构2.1.2 组件的 script 节点2.1.3 组件的 style 节点 2.2 Vue组件的使用步骤2.2.1 组件之间的父子关系2.2.2 使用组件的三个步…

低代码+定制:优化项目管理的新方案

引言 在当今快速变化的商业环境中&#xff0c;企业需要更加灵活、高效的项目管理工具。低代码平台作为一种新的开发方式&#xff0c;因其能够快速构建应用程序而受到广泛关注。与此同时&#xff0c;软件定制开发仍然是满足特定复杂需求的重要手段。在项目管理中&#xff0c;低代…

建筑可视化中使用云渲染的几大理由

在建筑行业中&#xff0c;可视化技术已成为不可或缺的一部分。无论是设计方案的展示、施工进度的模拟&#xff0c;还是最终效果的呈现&#xff0c;建筑可视化都发挥着至关重要的作用。 建筑可视化是指通过计算机技术和图形学算法&#xff0c;将建筑设计、规划和施工过程中的数据…

社交风潮塑造者:探索用户在Facebook的影响力

在当今数字化社会中&#xff0c;Facebook不仅是人们社交互动的主要平台&#xff0c;更是塑造社交风潮和文化趋势的重要力量。本文将从另一个角度深入探讨用户在Facebook上的影响力&#xff0c;探索其如何通过个人行为和互动&#xff0c;影响和改变社会的各个方面。 个人表达和内…

一站式企业服务平台能够帮助企业解决哪些问题?

近年来一站式企业服务平台备受区域政府及园区管理者的青睐&#xff0c;充当着区域政府或园区的千里眼和顺风耳&#xff0c;可以用来捕捉与区域经济发展相关的信息&#xff0c;也可以用来倾听企业的诉求&#xff0c;更是成为了区域深抓企业服务的多面手。 同时&#xff0c;一站式…

AI 卖货主播大模型:Streamer-Sales 销冠!MoneyPrinterTurbo :简直就是营销号的梦想工具!

AI 卖货主播大模型&#xff1a;Streamer-Sales 销冠!MoneyPrinterTurbo &#xff1a;简直就是营销号的梦想工具&#xff01; AI 卖货主播大模型&#xff1a;Streamer-Sales 销冠! 项目简介 Streamer-Sales 销冠 —— 卖货主播大模型 是一个能够根据给定的商品特点从激发用户购…

linux中 nginx+tomcat 部署方式 tomcat挂掉设置自动启动

在Linux环境下&#xff0c;要实现当Tomcat挂掉后自动重启&#xff0c;可以通过编写Shell脚本结合cron定时任务或者使用系统守护进程&#xff08;如Systemd、Upstart或SysVinit&#xff09;来完成。 使用Shell脚本和cron定时任务 编写检查并重启Tomcat的Shell脚本&#xff1a;首…

我的创作纪念日学期总结

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; 关于博主 目录 &#x1f308;前言&#x1f525;我的期末考试&#x1f525;我的学期总结&#x1f525;对未来的展望&#x1f308;结语 &#x1f308;前言 本篇博客主要内容&#xff1a;博…

maven 打包执行配置(对maven引用的包或者丢进去的包都包含在里面)打成jar包

一 、springboot jar包 maven的pom文件 1 在resources下放了一些文件想打进去jar包 2 在lib下放了其他稀奇古怪jar包文件想打进去jar包 编写如下引入jar <build><!-- 打包名称 --><finalName>${project.artifactId}</finalName><resources><…

在预训练语言模型主流架构

文章目录 编码器-解码器架构因果解码器架构前缀解码器架构在预训练语言模型时代,自然语言处理领域广泛采用了预训练 + 微调的范式,并诞生了以 BERT 为代表的编码器(Encoder-only)架构、以 GPT 为代表的解码器(Decoder-only)架构和以 T5 为代表的编码器-解码器(Encoder-d…

重磅!UOSDN焕新,开启创新之旅!

亲爱的开发者们 经过精心打磨和优化 全新改版的UOSDN&#xff08;统信开发者支持网络&#xff09; 已经正式上线啦&#xff01; 我们致力于为您打造一个更加便捷、高效、富有创意和互动性的开发平台&#xff0c;详情&#x1f449;https://uosdn.uniontech.com/ 以UOSDN作为载…