二叉树的方法

news2024/11/26 0:46:29

目录

一、二叉树的定义

​编辑

二、二叉树的创建

三、二叉树的遍历

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.coloradmin.cn/o/1873390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化巡检革命:旗晟双圆管轨道机器人的创新应用

在输煤皮带线和矿山带式输送机的巡检过程中&#xff0c;面临着高湿度、多粉尘、温湿度极端、噪音干扰&#xff1b;设备磨损频繁&#xff0c;难以及时发现问题&#xff1b;传统的人工巡检方式存在劳动强度大、效率低、检测质量不稳定、数据采集和分析滞后&#xff0c;无法实现实…

Promise 类的方法简介

文章目录 Promise.resolve() 和 Promise.reject()resolve()和reject()的参数 Promise.all()Promise.all()案例&#xff1a;多张图片上传Promse.allSettled()Promise.race()Promise.race()举例&#xff1a;图片加载超时Promise.race()举例&#xff1a;网络请求超时Promise.any()…

第4章 客户端-客户端管理

1. 客户端API 1.1client list client list命令能列出与Redis服务端相连的所有客户端连接信息。 127.0.0.1:6379> client list id254487 addr10.2.xx.234:60240 fd1311 name age8888581 idle8888581 flagsN db0 sub0 psub0 multi-1 qbuf0 qbuf-free0 obl0 oll0 omem0 events…

硬件实用技巧:摄像头常用的输出协议类型和输出接口类型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140042485 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

07-border布局的另一个用处

07-border布局的另一个用处 实现如下的布局: 分析: 1.USERNAME和PASSWORD使用form 2.PASSWORD的文本框使用NewMultiLineEntry 布局1 USERNAME和PASSWORD作为一个form整体&#xff0c;使用border布局&#xff0c;form设置为top&#xff0c;文本框设置为center参数。 packa…

Linux挂载Windows共享文件

一、Windows共享目录 二、Linux挂载 yum install cifs-utils mkdir /aaa/ mount.cifs -o usernamexxx,passwordxxx //172.16.8.121/aaa /aaa/

昇思25天学习打卡营第3天|数据集全攻略:加载、操作与自定义

导入数据集相关库和类 首先&#xff0c;导入了 NumPy 库&#xff0c;并将其简称为 np 。要知道&#xff0c;NumPy 乃是用于科学计算的关键库&#xff0c;作用非凡。接着&#xff0c;从 mindspore.dataset 当中导入了 vision 模块。此外&#xff0c;还从 mindspore.dataset 里引…

感染与疾病,感染的逐步进阶以及伴随的疾病发展

病原微生物和/或有害微生物成功入侵、繁殖并定居于宿主的体内或体内&#xff0c;从而导致健康障碍&#xff0c;称为感染。简单地说&#xff0c;它可以定义为由微生物引起的疾病。感染也被称为传染病或传染病或传染性疾病。 感染每年导致 1300多万 人死亡&#xff1b;2019 年死亡…

Liunx部署java项目Tomcat、Redis、Mysql教程

常用命令 查看,停止服务 服务进程情况&#xff0c;这里拿redis服务举例,其他服务查询更改名字即可 ps -ef|grep redis端口号是否被占用 lsof -i :6379显示tcp的端口和进程等相关情况 netstat -tnlp强制停止服务 kill -9 pidnum 防火墙 查看是否安装了firewalld sudo system…

Open WebUI升级到最新版本

背景介绍 open-webui是一个用于构建Web用户界面的开源库&#xff0c;它仿照 ChatGPT 的图形化界面&#xff0c;可以非常方便的调试、调用本地大语言模型。 目前该开源库更新较为活跃&#xff0c;从3个月前的版本&#xff08;v0.1.108&#xff09;到截止到2024年6月中旬发布的…

全网最详细Gradio教程系列——Gradio的安装与运行

全网最详细Gradio教程系列——Gradio的安装与运行 前言实战导论&#xff1a;2. Gradio的安装与运行2.1 安装2.1.1 Windows安装Gradio2.1.2 MacOS/Linux安装Gradio 2.2 运行2.2.1 普通方式运行2.2.2 热重载运行2.2.2.1 命令行式热重载2.2.2.2 Notebook热重载2.2.2.3 控制热重载 …

【LLM 论文】Self-Refine:使用 feedback 迭代修正 LLM 的 output

论文&#xff1a;Self-Refine: Iterative Refinement with Self-Feedback ⭐⭐⭐⭐ CMU, NeurIPS 2023, arXiv:2303.17651 Code: https://selfrefine.info/ 论文速读 本文提出了 Self-Refine 的 prompt 策略&#xff0c;可以在无需额外训练的情况下&#xff0c;在下游任务上产…

Python应用开发——30天学习Streamlit Python包进行APP的构建(11)

st.bokeh_chart 显示互动式虚化图。 Bokeh 是 Python 的一个图表库。此函数的参数与 Bokeh 的 show 函数的参数非常接近。有关 Bokeh 的更多信息,请访问 https://bokeh.pydata.org。 要在 Streamlit 中显示 Bokeh 图表,请在调用 Bokeh 的 show 时调用 st.bokeh_chart。 Fu…

Jmeter 进行http接口测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文主要针对http接口进行测试&#xff0c;使用 jmeter工具实现。 Jmeter工具设计之初是用于做性…

Qt项目实战[MP3音乐播放器搜索引擎]

MP3音乐播放器搜索引擎(设计与实现) 一、MP3音乐播放器搜索引擎(开发环境) 1:操作系统: Windows10 x64专业版。 2:开发工具: Qt 5.12.8。 3:网易云音乐官方API接口: https://neteasecloudmusicapi.js.org/#/?id%e7%99%bb%e5%bd%95 二、MP3音乐播放器搜索引擎(功能模块) …

动手学深度学习(Pytorch版)代码实践 -计算机视觉-40目标检测和边界框

40目标检测和边界框 import torch from PIL import Image import matplotlib.pylab as plt from d2l import torch as d2lplt.figure(catdog) img Image.open(../limuPytorch/images/catdog.jpg) plt.imshow(img) plt.show()# 边界框 #save def box_corner_to_center(boxes):…

HSRP热备份路由协议(VRRP虚拟路由冗余协议)配置以及实现负载均衡

1、相关原理 在网络中&#xff0c;如果一台作为默认网关的三层交换机或者路由器损坏&#xff0c;所有使用该网关为下一跳的主机通信必然中断&#xff0c;即使配置多个默认网关&#xff0c;在不重启终端的情况下&#xff0c;也不能彻底换到新网关。Cisco提出了HSRP热备份路由协…

写一个坏越的小世界(六)

blog基本已经接近尾声了&#xff0c;稍微再润色下。比如天气模块 这边加一个天气小图标&#xff0c;应该会好点吧~ 当不同天气的时候可以显示不同的图标 介绍这边加了个滚球特效。虽然看着还不是很好看&#xff0c;先凑合着吧 整了个开关灯按钮&#xff0c;可以切换黑白主题 …

Educational Codeforces Round 112 (Rated for Div. 2) C. Coin Rows(构造 + 贪心 + 前缀和)

可以知道爱丽丝的路径是拐两次弯的折线 那么我们知道鲍勃能够选择的位置只有两段黄线中的一段 所以可以求出来第二行的后缀和&#xff0c;然后求出来第一行的前缀行&#xff0c;这样鲍勃在爱丽丝分割之后的情况下就会选择这两者中最大的一段&#xff0c;然而爱丽丝也会阻碍鲍…

RabbitMQ实践——搭建单人聊天服务

大纲 创建Core交换器用户登录发起聊天邀请接受邀请聊天实验过程总结代码工程 经过之前的若干节的学习&#xff0c;我们基本掌握了Rabbitmq各个组件和功能。本文我们将使用之前的知识搭建一个简单的单人聊天服务。 基本结构如下。为了避免Server有太多连线导致杂乱&#xff0c;下…