Java数据结构之二叉树的基本操作

news/2024/5/19 9:47:02/文章来源:https://blog.csdn.net/weixin_43553142/article/details/127011227

二叉树的基本操作

  • 1 二叉树的基本概念
  • 2 二叉树的遍历
  • 3 代码实现二叉树的遍历
  • 4 代码实现前序、中序、后序查找
  • 5 代码实现二叉树指定节点的删除

1 二叉树的基本概念

(1)树有很多种,每个节点最多只能有两个子节点的树就是二叉树。
(2)二叉树的子节点分为左节点和右节点
(3)示意图
在这里插入图片描述
(4)如果所有二叉树的叶节点都在最后一层,并且节点总数为2*n-1,n为层数,则该二叉树为满二叉树。
在这里插入图片描述
(5)如果该二叉树的所有叶节点都在最后一层或者倒数第二层,而且最后一层的叶节点在左边连续,倒数第二层的叶节点在右边连续,则该二叉树为完全二叉树。
在这里插入图片描述

2 二叉树的遍历

二叉树的遍历方式有四种,前序遍历、中序遍历、后序遍历和层次遍历。这里介绍以下三种常用的遍历算法。
(1)前序遍历:先输出父节点,再遍历左子树和右子树
(2)中序遍历:先遍历左子树,再输出父节点,再遍历右子树
(3)后序遍历:先遍历左子树,在遍历右子树,再输出父节点
(4)小结:看父节点的输出顺序,确定是前序、中序还是后序。

3 代码实现二叉树的遍历

public class BinaryTreeDemo {public static void main(String[] args) {//创建一颗空二叉树BinaryTree binaryTree = new BinaryTree();//创建需要的节点TreeNode root = new TreeNode(1);TreeNode node2 = new TreeNode(2);TreeNode node3 = new TreeNode(3);TreeNode node4 = new TreeNode(4);TreeNode node5 = new TreeNode(5);//手动创建二叉树root.setLeft(node2);root.setRight(node3);node3.setRight(node4);node3.setLeft(node5);binaryTree.setRoot(root);}
}
//创建二叉树
class BinaryTree{private TreeNode root;public void setRoot(TreeNode root){this.root = root;}//前序遍历public void preOrder(){if (this.root != null){this.root.preOrder();}else {System.out.println("二叉树为空,无法遍历");}}//中序遍历public void infixOrder(){if (this.root != null){this.root.infixOrder();}else {System.out.println("二叉树为空,无法遍历");}}//后序遍历public void postOrder(){if (this.root != null){this.root.postOrder();}else {System.out.println("二叉树为空,无法遍历");}}//先序遍历查找public boolean preOrderSearch(int no){if (this.root != null){TreeNode resNode = this.root.preOrderSearch(no);if (resNode != null)  return true;}else {System.out.println("二叉树为空,无法查找!\n");}return false;}//中序遍历查找public boolean infixOrderSearch(int no){if (this.root != null){TreeNode resNode = this.root.infixOrderSearch(no);if (resNode != null) {return true;}}else {System.out.println("二叉树为空,无法查找!\n");}return false;}//后序遍历查找public boolean postOrderSearch(int no){if (this.root != null){TreeNode resNode = this.root.postOrderSearch(no);if (resNode != null) return true;}else {System.out.println("二叉树为空,无法查找!\n");}return false;}//递归删除节点public void delNode(int no){if (root != null){//如果只有一个root节点,判断root是否是需要删除的节点if (root.getVal() == no){root = null;}else {//递归删除root.deleteNode(no);}}else {System.out.println("空树,不能删除!");}}}//创建二叉树的节点
class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(){}TreeNode(int val){this.val =val;}TreeNode(int val,TreeNode left,TreeNode right){this.val = val;this.left = left;this.right = right;}public int getVal() {return val;}public void setVal(int val) {this.val = val;}public TreeNode getLeft() {return left;}public void setLeft(TreeNode left) {this.left = left;}public TreeNode getRight() {return right;}public void setRight(TreeNode right) {this.right = right;}//编写前序遍历方法public void preOrder(){System.out.print(this.val+" "); //先输出父节点//递归向左子树前序遍历if (this.left != null){this.left.preOrder();}//递归向右子树前序遍历if (this.right != null){this.right.preOrder();}}//中序遍历public void infixOrder(){//递归向左子树中序遍历if (this.left != null){this.left.infixOrder();}//输出父节点System.out.print(this.val+" ");;//递归向右子树中序遍历if (this.right != null){this.right.preOrder();}}//后序遍历public void postOrder(){//递归向左子树后序遍历if (this.left != null){this.left.postOrder();}//递归向右子树后序遍历if (this.right != null){this.right.postOrder();}//输出根节点System.out.print(this.val+" ");}
}

4 代码实现前序、中序、后序查找

//前序遍历查找public TreeNode preOrderSearch(int no){if (this.val == no){return this;}TreeNode resNode = null;if (this.left != null){resNode = this.left.preOrderSearch(no);}if (this.right != null){resNode = this.right.preOrderSearch(no);}return resNode;}//中序遍历查找public TreeNode infixOrderSearch(int no){//判断当前节点的左子节点是否为空,如果不为空,则递归中序查找TreeNode resNode = null;if (this.left != null){resNode = this.left.infixOrderSearch(no);}if (resNode != null){return resNode;}System.out.println("进入中序查找\n");if (this.val == no){return this;}if (this.right != null){resNode = this.right.infixOrderSearch(no);}return resNode;}//后序遍历查找public TreeNode postOrderSearch(int no){TreeNode resNode = null;if (this.left != null){resNode = this.left.postOrderSearch(no);}if (resNode != null){  //说明左子树找到return resNode;}if (this.right != null){resNode = this.right.postOrderSearch(no);}if (resNode != null){  //说明右子树找到return resNode;}System.out.println("进入后序遍历\n");//如果左右子树都没有找到if (this.val == no){return this;}return resNode;}

5 代码实现二叉树指定节点的删除

    //递归删除节点//1.如果删除的节点是叶子节点,则删除该节点//2.如果删除的节点是非叶子节点,则删除该子树public void deleteNode(int no){//如果当前节点的左子节点不为空,并且左子节点就是要删除的节点,就将this.left = null;并且就返回(结束递归删除)if (this.left != null && this.left.val == no){this.left = null;return;}//如果当前节点的右子节点不为空,并且右子节点就是要删除的节点,就将this.right = null;并且就返回(结束递归删除)if (this.right != null && this.right.val == no){this.right = null;return;}//向左子树递归删除if (this.left != null){this.left.deleteNode(no);}//向右子树递归删除if (this.right != null){this.right.deleteNode(no);}}

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

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

相关文章

[CISCN 2019 初赛]Love Math

<?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("太长了不会算");}$blacklist [ , \t, \r, \n…

【C++11新特性】类的新功能,可变模板参数,包装器

文章目录一、类的新功能1.default2.delete二、可变参数模板1.参数包2.参数包的插入与解析(1)参数包的个数(2)添加参数解析(3)逗号表达式展开(4)emplace_back三、包装器1.function(封装)2.bind(绑定)一、类的新功能 1.default 在继承与多态中&#xff0c;我们介绍了final与ove…

Feign的简单介绍及配置参数

contextId用于区分实例,类似beanName

mysql存储过程的写法

示例表 area_code_2022 &#xff1a; DROP TABLE IF EXISTS area_code_2022; CREATE TABLE area_code_2022 ( code bigint(12) unsigned NOT NULL COMMENT 区划代码, name varchar(128) NOT NULL DEFAULT COMMENT 名称, level tinyint(1) NOT NULL COMMENT 级别1-5,省市…

python识别选中文本

目标&#xff1a;识别鼠标选中区域的文本 be like : 这是我在模拟键鼠操作时遇到的情况&#xff0c;我需要根据某个位置返回的值进行判断&#xff0c;但是只是依赖pyautogui是做不到的。 方法一 经过上网冲浪寻找答案&#xff0c;被告知了此方法&#xff0c;经测试可行 impor…

Django项目想要在 Python Console里面进行操作 报错找不到对应模块

Django项目想要在 Python Console里面进行操作 报错找不到对应模块 问题描述 ModuleNotFoundError: No module named django ’ 问题原因 在进行对 Python console操作 进行管理查询要导入对应的模块&#xff0c;但是和项目中的models.py文件中的 导包引入 冲突了 导致在Py…

可持久化Trie

可持久化指的是可以记录所有的历史版本&#xff0c;即记录下来每一步操作后的状态 下图模拟过程 题目&#xff1a; 最大异或和 给定一个非负整数序列 a&#xff0c;初始长度为 N。 有 M 个操作&#xff0c;有以下两种操作类型&#xff1a; A x&#xff1a;添加操作&#xff0…

uniapp自用速查表 - 我的常用组件

纯私人class&#xff0c;公开文章是方便置顶.... <!-- 自定义导航栏 占位空间 --> <view class"navigationStyleCustomHeight alwaysOnTopBox0 bgColorForTheme"></view> <!-- 自定义导航栏 --> <view class"alwaysOnTopBox1 myNav…

java正则表达式简单使用

String email = "13072558368"; email = email.replaceAll("(\\d{3})\\d{6}(\\d{2})", "$1****$2"); System.out.println("email=" + email); email=130****68从第三个开始,计算6个数字,其中计算的6个数字用*替换String mobile = &q…

java public、protected、default、private

java 的访问控制符为了控制类还有类对应方法的访问做限制。如上的图表总结了类方法的访问控制范围,其实类的访问控制范围也是类似的情况。声明为public则不管外部包还是内部都能够访问,如果为default则只能本包内能够访问 关于类方法的访问范围,我们比较熟悉的是private还有…

java基于ssm的自助旅游管理系统

传统的旅游方式存在着漫无目的的寻找住、吃等问题&#xff0c;这样游客很累&#xff0c;也十分浪费时间。因此一个专门用来给游客介绍一些地方的景点、吃、住、特产等信息的在线旅游网站将给游客的出行选择带来极大的方便快捷。人们迫切能有一个旅游网站&#xff0c;解决旅游过…

linux软件包管理 实验报告

实验任务 对软件包进行一些基础操作 实验环境 一台centos7实验步骤 1.下载一个软件包进行实验 将软件包拖进去 查看是否存在 因为只是下载了软件包,并没有安装所以用qa并不能查找到软件包 2.查看安装包的基本信息 3.查看软件包安装在哪个路径 4.安装软件包 确认是否安装…

短期逆风造成了小鹏汽车的股价持续暴跌和错误定价

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 小鹏汽车2022年第二季度财务业绩分析 小鹏汽车近期发布的2022年第二季度财报显示&#xff0c;营收超过预期&#xff0c;但收益未达到预期。第二季度营收为11.1亿美元&#xff0c;略高于预期&#xff0c;而每股收益亏损为0.…

node-sass安装报错及其解决方案

一、下载依赖报错 这里报错了也就没后面的剧情了,就像电视剧刚开局主角就嗝屁了,看看执行 npm i 的时候报错类容: 二、解决方案 1、下载源在国外,更换中国镜像源,删除package.json中的node-sass,分别下载node包和node-sass的依赖包1 //更换淘宝镜像源 2 npm config set re…

【牛客 - 剑指offer】JZ61 扑克牌顺子 两种方案 Java实现

文章目录剑指offer题解汇总 Java实现本题链接题目方案一 哈希表方案二 排序剑指offer题解汇总 Java实现 https://blog.csdn.net/guliguliguliguli/article/details/126089434 本题链接 知识分类篇 - 模拟 - JZ61 扑克牌顺子 题目 题目主要信息 两副扑克牌抽五张&#xff0…

图像处理之直方图均衡

直方图均衡是一种将图像中的灰度分布转换成均匀分布&#xff0c;从而增强图像的对比度的图像处理方法。直方图均衡可以将原本偏白或者偏黑的图像转换成对比度符合人眼视觉的图像。 1 原理 连续空间   连续空间内的图像灰度r∈[0,L−1]&#xff0c;L表示灰度级r\in[0,L-1]&a…

上线记 | 人大金仓助力东莞卫生健康领域核心系统改造升级

随着人工智能、云计算、大数据、机器学习等新兴技术在医疗信息化建设中不断深入&#xff0c;以患者为中心、构建智慧医院、提升医院信息智能化问题迫在眉睫。为进一步深化医改工作&#xff0c;加强妇幼卫生信息管理&#xff0c;东莞市卫生健康局对东莞妇幼卫生信息平台进行了国…

[leetcode top100] 0923 多数元素,反转链表,翻转二叉树,回文链表,移动零

目录 169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 234. 回文链表 - 力扣&#xff08;LeetCode&#xff09; 283. 移动零 - 力扣&#xff08;Le…

2106. 摘水果(每日一难phase-day22)

2106. 摘水果 在一个无限的 x 坐标轴上&#xff0c;有许多水果分布在其中某些位置。给你一个二维整数数组 fruits &#xff0c;其中 fruits[i] [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上。fruits 已经按 positioni 升序排列 &#xff0c;每个 positi…

3. 链表

链表是一种通过指针串联在一起的线性结构,每一个结点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个结点的指针域指向null(空指针的意思)。  1. 链表基础单链表:指针域只指向结点的下一个结点。双链表:每一结点有两个指针域,一个指向下…