当前位置:网站首页>二叉树第一部分
二叉树第一部分
2022-06-24 09:32:00 【牧..】
文章目录
二叉树

树形结构
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
它具有以下的特点:有一个特殊的节点,称为根节点,
根节点没有前驱节点除根节点外,
其余节点被分成M(M > 0)个互不相交的集合T1、T2、…、Tm,其中每一个集合 Ti (1 <= i<= m) 又是一棵与树类似的子树。
每棵子树的根节点有且只有一个前驱,可以有0个或多个后继
树是递归定义的。

概念(重要)

知道了 概念 那么 如何 表示 树呢 ???

树的表示形式
树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,
孩子表示法、孩子兄弟表示法等等。我们这里就简单的了解其中最常用的**孩子兄弟表示
2、二叉树
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉
树组成。
二叉树的特点:
每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。
二叉树的子树有左右之分,其子树的次序不能颠倒,因此二叉树是有序树。
(有序 不是 大小有序 而是 顺序)

两种特殊的二叉树
概念 :
- 满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果
一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。 - 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n
个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全
二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

二叉树的 性质



看完了二叉树的性质那么接下来我们来了解一下二叉树的存储
3、二叉树的存储
二叉树的存储结构分为:顺序存储和类似于链表的链式存储
这里我们 主要理解 链式存储 而顺序 存储 则 会在堆中常用
二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式,具体如下:
// 孩子表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
// 孩子双亲表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
Node parent; // 当前节点的根节点
}
二叉树的创建
这里 我们 创建一个二叉树 会使用 一个非常非常佬的 创建方式
不是 真正的 创建方式 ,我们先这样 创建 来理解 一下 二叉树的性质

附上代码
class BTNode {
public char val;
// 左孩子引用
public BTNode left;
// 右孩子
public BTNode right;
public BTNode (char val) {
this.val = val;
}
}
public class BinaryTree {
public BTNode root; // 二叉树的根节点
public BTNode createTree() {
BTNode A = new BTNode('A');
BTNode B = new BTNode('B');
BTNode C = new BTNode('C');
BTNode D = new BTNode('D');
BTNode E = new BTNode('E');
BTNode F = new BTNode('F');
BTNode G = new BTNode('G');
BTNode H = new BTNode('H');
A.left = B;
A.right = C;
B.left = D;
B.right = E;
C.left = F;
C.right = G;
E.right = H;
return A;
}
}
二叉树的遍历(重点)
3种遍历方式 (访问二叉树时机不同)
1.前序遍历(先根遍历

2.中序遍历

3.后续遍历

总结
学习完了 二叉树 的 三种遍历 方式 发现 他们 是 沿着一条路线 的,只是打印 的 时机 不同而已
练习

1.代码实现前序遍历
1.前序遍历 根 --》 左子树 --》 右子树
// 通过 递归 实现前序遍历
void preOrder(BTNode root) {
if(root == null) {
return;
}
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}


知道了 前序 遍历 那么 我们直接 来做 前序遍历 的 oj 题
二叉树的前序遍历
方法一 :遍历 思路
class Solution {
//这里 保证 了 list 都 只有 一份
List<Integer> list = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if(root == null) {
return list;
}
list.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
return list;
}
}
方法二 : 子问题思路
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root == null) {
return list;
}
list.add(root.val);
List<Integer> leftTree = preorderTraversal(root.left);
list.addAll(leftTree);
List<Integer> rightTree = preorderTraversal(root.right);
list.addAll(rightTree);
return list;
}
}

·知道前序 遍历 那么 中序遍历 和 后续遍历 那么 不就是 调整一下 递归 顺序吗
2.中序遍历 左子树 --》 根 --》 右子树
// 中序遍历
// 左子树 --》 根 --》 右子树
void inOrderTraversal(BTNode root) {
if(root == null) {
return;
}
inOrderTraversal(root.left);
System.out.print(root.val+" ");
inOrderTraversal(root.right);
}
二叉树的中序遍历
方法一 : 遍历思路
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
if(root == null) {
return list;
}
inorderTraversal(root.left);
list.add(root.val);
inorderTraversal(root.right);
return list;
}
}
方法二 : 子问题思路
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root == null) {
return list;
}
List<Integer> leftTree = inorderTraversal(root.left);
list.addAll(leftTree);
list.add(root.val);
List<Integer> rightTree = inorderTraversal(root.right);
list.addAll(rightTree);
return list;
}
}
3.后序遍历 左子树 --》右子树 --》 根
// 后序遍历
// 右子树 --》 左子树 --》 根
void postOrderTraversal(BTNode root) {
if(root == null) {
return;
}
inOrderTraversal(root.left);
inOrderTraversal(root.right);
System.out.print(root.val+" ");
}
二叉树的后序遍历
方法一 : 遍历思想
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
if(root == null) {
return list;
}
postorderTraversal(root.left);
postorderTraversal(root.right);
list.add(root.val);
return list;
}
}
方法二 : 子问题思路
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList();
if(root == null) {
return list;
}
List<Integer> leftTree = postorderTraversal(root.left);
list.addAll(leftTree);
List<Integer> rightTree = postorderTraversal(root.right);
list.addAll(rightTree);
list.add(root.val);
return list;
}
}
这里来 一个 idea 快捷键 整体改变 变量命 shift 加 f6
程序遍历
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从
左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是
层序遍历。
最后在来 4道题 结束 第一部分二叉树



边栏推荐
- Threejs MMD model loading + contour loading + animation loading + Audio loading + camera animation loading +ammojs loading gltf model loading +gltf reflection adjustment
- 文献调研报告
- 生产者/消费者模型
- Event registration Apache pulsar x kubesphere online meetup hot registration
- About thinkphp5, use the model save() to update the data prompt method not exist:think\db\query- & gt; Error reporting solution
- 数字化转型的失败原因及成功之道
- 记录一下MySql update会锁定哪些范围的数据
- Conseils étonnants pour promouvoir les ventes d'entreprise avec le chat en direct
- CICFlowMeter源码分析以及为满足需求而进行的修改
- ApplicationContextInitializer的三种使用方法
猜你喜欢

英伟达这篇CVPR 2022 Oral火了!2D图像秒变逼真3D物体!虚拟爵士乐队来了!

记录一下MySql update会锁定哪些范围的数据

顶刊TPAMI 2022!基于不同数据模态的行为识别:最新综述

Conseils étonnants pour promouvoir les ventes d'entreprise avec le chat en direct

The ambition of JD instant retailing from 618

Learning Tai Chi Maker - esp8226 (XIII) OTA

ThinkPHP5多语言切换项目实战

Oracle 12c升级至19c后ORA-28000错误

tp5 使用post接收数组数据时报variable type error: array错误的解决方法

impdp导schema报ORA-31625异常处理
随机推荐
CICFlowMeter源码分析以及为满足需求而进行的修改
Inspiration from reading CVPR 2022 target detection paper
观察者模式
二十、处理器调度(RR时间片轮转,MLFQ多级反馈队列,CFS完全公平调度器,优先级翻转;多处理器调度)
ApplicationContextInitializer的三种使用方法
ORA-16038 ORA-19502 ORA-00312故障处理
开源一款监控数据采集器,啥都能监控
Time series data augmentation for deep learning: paper reading of a survey
IDEA 无法保存设置 源根 D:XXXX在模块XXX中重复
Thinkphp5 clear the cache cache, temp cache and log cache under runtime
php文件锁
Idea cannot save settings source root d:xxxx is duplicated in module XXX
算法---矩阵中战斗力最弱的 K 行(Kotlin)
生产者/消费者模型
Algorithm -- find and maximum length k subsequence (kotlin)
Ora-16038 ora-19502 ora-00312 troubleshooting
数字化转型的失败原因及成功之道
字节跳动-面试官: 谈下音视频同步原理,音频和视频能绝对同步吗?
十大证券公司哪个佣金最低,最安全可靠?有知道的吗
PHP file lock