攀爬二叉树,发现新的美

二叉树

什么是二叉树? 二叉树的基础概念? 性质? 问题?


文章目录

  • 二叉树
  • 一、二叉树的概念
    • (一)认识二叉树
    • (二)二叉树的性质
  • 二、遍历二叉树
    • 1.前序遍历
    • 2.中序遍历
    • 3.后序遍历
    • 4.层序遍历
  • 三丶创建二叉树
  • 总结


一、二叉树的概念

(一)认识二叉树

二叉树是一种非线性的数据结构,
结点的度:一个结点含有子树的个数称为该结点的度
树的度:一棵树中,所有结点度的最大值称为树的度;
叶子结点:度为0的结点称为叶结点;
父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;
孩子子结点:一个结点含有的子树的根结点称为该结点的子结点;
根结点:一棵树中,没有双亲结点的结点;
结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推
树的高度或深度:树中结点的最大层次;
在这里插入图片描述
满二叉树:一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树
完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的

在这里插入图片描述

(二)二叉树的性质

1.对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1
推导:

在这里插入图片描述
2. 具有n个结点的完全二叉树的深度k为log2(n+1)上取整
3.对于具有n个节点完全二叉树,如果从上至下 从左到右的顺序对所有节点从0开始编号
则对于序号为i的结点有:

  • 若 i > 0,双亲序号为 (i-1)/2: i 为 0 时 ,i为根结点.
  • 若 2i+1<n,左孩子序号为2i + 1 否则无左孩子
  • 若 2i+2<n,右孩子序号为2i + 2 否则无右孩子

二、遍历二叉树

以这颗二叉树为栗子
在这里插入图片描述
实例化节点的对象并且创建二叉树

public class binaryTree {class TreeNode{public char val;private TreeNode left;private TreeNode right;public TreeNode(char val){this.val = val;}}public TreeNode createTree(){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;B.left = D;B.right = E;E.right = H;A.right = C;C.left = F;C.right = G;return A;}}

遍历方式分为两种 1.递归遍历 2.非递归遍历
递归遍历:把问题拆分成子问题,判断结束条件和执行的代码

    每次递归时 判断该节点是否为空 作用:1.避免空指针异常2.为空时就返回 执行下一步操作

1.前序遍历

递归

	
public void preOrder(TreeNode root){if(root==null){return;}//打印System.out.print(root.val+" ");//遍历左子树preOrder(root.left);//遍历右子树preOrder(root.right);}

非递归
在这里插入图片描述

 public List<Character> preOrderNot(TreeNode root){List<Character> list = new ArrayList<>();Stack<TreeNode> s = new Stack<>();TreeNode cur = root;while (cur!=null || !s.empty()) {while(cur!=null){s.push(cur);list.add(cur.val);cur = cur.left;}TreeNode top = s.pop();cur = top.right;}return list;}

2.中序遍历

递归

 public void inOrder(TreeNode root){if(root ==null){return;}inOrder(root.left);/*打印之前 需要把递归每一个的左子树,直到左为空然后才能打印  , 在递归此时的右子树 不断循环*/System.out.print(root.val +" ");inOrder(root.right);}

非递归

public List<Character> inOrderNot(TreeNode root){List<Character> list = new ArrayList<>();Stack<TreeNode> s = new Stack<>();TreeNode cur = root;while (cur!=null || !s.empty()) {while(cur!=null){s.push(cur);cur = cur.left;}TreeNode top = s.pop();list.add(top.val);cur = top.right;}return list;}

3.后序遍历

递归

  public void postOrder(TreeNode root){if(root==null){return;}postOrder(root.left);postOrder(root.right);System.out.print(root.val+" ");}

非递归

public List<Character> postOrderNot(TreeNode root){List<Character> list = new ArrayList<>();Stack<TreeNode> s = new Stack<>();TreeNode cur = root;TreeNode prev = null;while (cur!=null || !s.empty()) {while(cur!=null){s.push(cur);cur = cur.left;}TreeNode top = s.peek();if(top.right==null || top.right == prev){s.pop();list.add(top.val);prev = top;}else {cur = top.right;}}return list;}

4.层序遍历

层序遍历用递归实现是不能的,因为每一层的相邻节点没有直接的关系.
所以只能用非递归,那么非递归需要如何实现呢?
此时就要借助于队列
此时来个动画演示
在这里插入图片描述

  //层序遍历public 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);}}}

同时再刷下力控上的层序遍历

 public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> ret = new ArrayList<>();if(root == null){return ret;}Queue<TreeNode> q  = new LinkedList<>();q.offer(root);while(!q.isEmpty()){int size = q.size();List<Integer> list = new ArrayList<>();while(size>0){TreeNode cur = q.poll();list.add(cur.val);if(cur.left!=null){q.offer(cur.left);}if(cur.right!=null){q.offer(cur.right);}size--;}ret.add(list);}return ret;}

在这里插入图片描述

三丶创建二叉树

问题描述:编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
题目源自于二叉树遍历

import java.util.Scanner;
//new一个节点
class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val){this.val = val;}
}
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {//成员变量 避免递归时出现容错	/*根据先序字符串来创建二叉树,首先就要先遍历每一个字符,每遍历一个不为null('#')的时候都要创建一个节点,再不断进行i++操作 遇到字符为空时 就可以根据递归来连接每一个节点*/public static int i = 0;public static TreeNode createTree(String s){char[] ch = s.toCharArray();TreeNode root = null;if(ch[i]!='#'){root = new TreeNode(ch[i]);i++;root.left = createTree(s);root.right = createTree(s);}else{i++;}return root;}public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString s = in.nextLine();TreeNode root = createTree(s);inOrder(root);}}//中序遍历public static void inOrder(TreeNode root){if(root==null){return;}inOrder(root.left);System.out.print(root.val+" ");inOrder(root.right);}
}

总结

提示:这里对文章进行总结:
二叉树的基础大概这些内容,这些代码一定要多理解,多敲 才能更进一步,二叉树较不易理解的内容还未更新,等下次复习的时候再更新~

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

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

相关文章

SFOS2:组件介绍

一、前言 在sailfish os application的开发过程中&#xff0c;几乎是困难重重&#xff0c;因为我暂未找到具有完整性、指导性、易懂性的开发文档&#xff0c;特别是组件的使用&#xff0c;现决定将自己的探究结果记录下来。因此&#xff0c;这篇文章只会具有参考价值&#xff0…

UI自动化测试最佳设计模式POM

当使用Selenium进行UI自动化测试时&#xff0c;Page Object Model&#xff08;POM&#xff09;是一种最佳实践的设计模式。POM的核心思想是通过将页面封装成对象&#xff0c;使得测试代码更加清晰、可维护和可重用。 POM的主要组成部分包括页面对象类、元素定位方式和操作方法…

从 0 开始实现一个博客系统 (SSM 项目)

相关技术 Spring Spring Boot Spring MVC MyBatis Html Css JS pom 文件我就不放出来了, 之前用的 jdk8 做的, MySQL 用的 5.7, 都有点老了, 你们自己看着配版本就好 实现功能 用户注册 - 密码加盐加密 (md5 加密)前后端用户信息存储 - 令牌技术用户登录 - (使用 拦截…

python清洗苹果产量数据:从字符串到整型的转化

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、使用普通方法清洗数据 1. 创建字典并遍历 2. 示例代码 3. 结果展示 三、使…

vscode 插件-01基础

翻译 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 适用于 VS Code 的中文&#xff08;简体&#xff09;语言包 远程连接 Remote Development Remote Development是vscode的远程编程与调试的插件&#xff0c;使用这个插件可以在很多情况下代替vim…

一篇文章搞懂二叉树

文章目录 DP 树叶的度树的度节点的层次节点的祖先节点的子孙双亲节点或父节点 树的表示孩子兄弟表示法双亲表示法树和非树树的应用 二叉树满二叉树完全二叉树推论二叉树的存储以数组的方式以链表的方式堆(Heap)堆的分类大根堆和小根堆的作用 二叉树的遍历DFS和BFS DP 动态规划…

Java Object类方法介绍

Object作为顶级类&#xff0c;所有的类都实现了该类的方法&#xff0c;包括数组。 查询Java文档&#xff1a; 1、object.eauqls(): 其作用与 有些类似。 &#xff1a; 是一个比较运算符&#xff0c;而不是一个方法。 ①可以判断基本类型&#xff0c;也可以判断引用类型。 ②若…

c++编程(15)——list的模拟实现

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 前言list的数据结构list的默认构造尾插与尾删iterator插入和删除构造、析构、赋值copy构造initializer_list构造operator 析构函数 前言 受限于博主当前的技术水平&#xff0c;暂时还不能模拟实现出STL当中用…

详解 Spark 的运行架构

一、核心组件 1. Driver Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实际代码的执行工作主要负责&#xff1a; 将用户程序转化为作业 (job)在 Executor 之间调度任务 (task)跟踪 Executor 的执行情况通过 UI 展示查询运行情况 2. Exec…

FPGA实现多路并行dds

目录 基本原理 verilog代码 仿真结果​ 基本原理 多路并行dds&#xff0c;传统DDS的局限性在于输出频率有限。根据奈奎斯特采样定理&#xff0c;单路DDS的输出频率应小于系统时钟频率的一半。但是在很多地方&#xff0c;要使采样率保持一致&#xff0c;所以&#xff0c;为了…

如何选择适合自己需求的云服务器

最近明月接了一个跨境电商的代维业务&#xff0c;发现他们的云服务器很有代表性&#xff0c;今天就以此为例给大家分享一下应该如何选择适合自己需求的云服务器。像明月这样专做代维业务的可以说什么云服务器都体验过了&#xff0c;也发现大家在选择自己的云服务器的时候有很大…

大数据面试题 —— Hive

目录 Hive 是什么为什么要使用 HiveHive 的优缺点Hive的实现逻辑&#xff0c;为什么处理小表延迟比较高你可以说一下 HQL 转换为 MR 的任务流程吗 ***你可以说一下 hive 的元数据保存在哪里吗 ***Hive与传统数据库之间的区别Hive内部表和外部表的区别 ***hive 动态分区与静态分…

97.网络游戏逆向分析与漏洞攻防-ui界面的设计-通过逆向分析确认角色信息

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

MySQL实战行转列(或称为PIVOT)实战sales的表记录了不同产品在不同月份的销售情况,进行输出

有一个sales的表&#xff0c;它记录了不同产品在不同月份的销售情况&#xff1a; productJanuaryFebruaryMarchProduct AJanuary10Product AFebruary20Product BJanuary5Product BFebruary15Product CJanuary8Product CFebruary12 客户需求展示为如下的样子&#xff1a; pro…

手机投屏技巧:手机怎么投屏到电脑显示屏上?精选6招解决!

手机怎么投屏到电脑显示屏上&#xff1f;出于一些不同的原因&#xff0c;大多数人都希望能将手机投屏到电脑上。其中一个常见的原因是&#xff0c;大家经常会希望在笔记本电脑上共享图片&#xff0c;而无需上传或者登录微信进行文件传输。以及希望不依靠投影仪&#xff0c;就能…

MFC工控项目实例之一主菜单制作

1、本项目用在WIN10下安装的vc6.0兼容版实现。创建项目名为SEAL_PRESSURE的MFC对话框。在项目res文件下添加相关256色ico格式图片。 2、项目名称&#xff1a;密封压力试验机 主菜单名称&#xff1a; 系统参数 SYS_DATA 系统测试 SYS_TEST 选择型号 TYP_CHOICE 开始试验 TES_STA…

2024.05.29学习记录

1、css面经复习 2、代码随想录二刷 3、rosebush upload组件初步完成

QT C++ 读写mySQL数据库 图片 例子

在上篇文章中描述了怎样搭建读写数据库的环境。 本文更进一步&#xff0c;描述了读写mySQL数据库&#xff0c;字符、整型数字、图片。读写图片相对难点。 数据库的图片字段用BLOB&#xff0c;如果图片较大要用longblob,否则会报错。 另外&#xff0c;读写数据库都使用了短连…

长安链使用Golang编写智能合约教程(一)

长安链是分2.1.和2.3.两个版本&#xff0c;本节面说的是2.1.的版本 需要2.3.版本的合约&#xff0c;请看教程&#xff08;二&#xff09;&#xff01; 教程&#xff08;二&#xff09;我会写如何查历史数据 教程二&#xff1a;&#xff08;长安链2.3.的版本的智能合约编写&…

JetLinks物联网平台在windows 7搭建(前后端)部署教程

近期对接TCP、modbusTCP等自定义解析&#xff0c;做了很多万能解析的方法&#xff0c;却都不遂人意&#xff0c;而一直在用的ThingsBoard不能直接对接TCP透传(企业版除外)&#xff0c;需要在外围做一些自定义解析&#xff0c;然后转json再mqtt上传&#xff0c;感觉来说比较麻烦…