【算法通关村第六关——其实很简单的树】

系列文章目录

算法通关村第一关
算法通关村第二关
算法通关村第三关
算法通关村第四关
算法通关村第五关


前言

在前一关算法通关村第五关,我们介绍了Hash和队列的基本概念和常见算法,可以发现,不难发现,一些复杂的算法用Hash很容易解决,面试中算法题用Hash就显得没什么思维含量,所以一般作为第二选择。
没有学会树,相当于数据结构白学,这一节,我们主要聊一聊树。

一、树的概念

树是一种非线性的数据结构,它模拟了一种层次关系,其中每个节点都有一个值,并且可能有零个或多个子节点。树的一个重要特性是它没有循环,也就是说,从根节点到任何其他节点的路径是唯一的。

树的概念名词:

1.节点的度:一个节点含有的子节点的个数称为该节点的度:
2.树的度:一棵树中,最大的节点的度称为树的度,注意与节点度的区别:
3.叶节点或终端节点:度为0的节点称为叶节点:
4.非终端节点或分支节点:度不为0的节点;
5.双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点:6.孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点:7.兄弟节点:具有相同父节点的节点互称为兄弟节点:
8.节点的祖先:从根到该节点所经分支上的所有节点;
9.子孙:以某节点为根的子树中任一节点都称为该节点的子孙10.森林:由m(m>=0)棵互不相交的树的集合称为森林:
11.无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树:12.有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树:13.二又树每个节点最多含有两个子树的树称为二叉树:

二、树的性质

  1. 树是递归定义的,每个节点都有一个父节点。
  2. 空树是指没有任何节点的树。
  3. 只有一个根节点的树称为单根树。
  4. 树中每个节点的值都是唯一的。
  5. 空树的深度为0,单根树的深度为1,n叉树的深度为h,当且仅当其高度不超过log(n)。
  6. 对于树中的任意两个节点u和v,如果u是v的祖先,则u的所有后代节点都小于等于v。
  7. 树的高度是其最长路径上的节点数量。

三、树的定义与存储方式

定义树的原理与前面讲的链表本质上是一样的,只不过多了一个指针,如果是二叉树,只要在链表的定义上增加一个指针就可以了

//定义二叉树
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
}
//定义N叉树
public class TreeNode {
int val;
List<TreeNode> nodes;
}

四、树的遍历方式

  1. 前序遍历:先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。
  2. 中序遍历:先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。
  3. 后序遍历:先递归地遍历左子树,然后递归地遍历右子树,最后访问根节点。
  4. 层序遍历:按照从上到下、从左到右的顺序访问每一层的节点。可以使用队列实现。
  5. 广度优先遍历:使用队列按照层次顺序访问每一层的所有节点。
  6. 深度优先遍历:使用栈按照深度顺序访问每个节点。

五、通过序列构造二叉树

前面我们已经介绍了前中后序遍历的基本过程,现在我们看一下如何通过给出的序列来恢复原始二又树看三个序列:
(1)前序: 1 2 3 4 5 6 8 7 9 10 11 12 13 15 14
(2)中序: 3 4 8 6 7 5 2 1 10 9 11 15 13 14 12
(3)后序: 8 7 6 5 4 3 2 10 15 14 13 12 11 9 1

5.1 通过中序和后序序列恢复二叉树

我们先看如何通过中序和后序序列恢复二叉树

中序: 3 4 8 6 7 5 2 1 10 9 11 15 13 14 12
后序: 8 7 6 5 4 3 2 10 15 14 13 12 11 9 1

  • 第一轮
    根据后序列表,可以得出二叉树的根节点为1,在按照中序推出左右子节点的大概内容为:

中序数组可以分为
【3 4 8 6 7 5 2】1【10 9 11 15 13 14 12】
后序数组可以分为
【8 7 6 5 4 3 2】【10 15 14 13 12 11 9】1
根据中序的划分结果,1左边的都为左子树的内容,1右边的都为右子树的内容所以可以按照上面的分

第一轮结果如下图所示:![在这里插入图片描述](https://img-blog.csdnimg.cn/9a31ca2517d345d48439407668acd6f5.png

  • 第二轮:
    按照第一轮的逻辑,分别对左右两部分进行拆分,先看左边的

左边
中序:【3 4 8 6 7 5 2】
后序:【8 7 6 5 4 3 2】
按照逻辑拆分后得出
中序:【3 4 8 6 7 5】 2
后序:【8 7 6 5 4 3 】2

右边
中序:【10 9 11 15 13 14 12】
后序:【10 15 14 13 12 11 9】
按照逻辑拆分后得出
中序:【10 】9 【11 15 13 14 12】
后序:【10 】【15 14 13 12 11 】9

第二轮结果如下图所示:
在这里插入图片描述

  • 第三轮:
    继续按照上述逻辑进行拆分

---- 左边
中序:3 【4 8 6 7 5】
后序:【8 7 6 5 4 】3
---- 右边
中序:11 【15 13 14 12】
后序:【15 14 13 12 】 11

第三轮结果如下图所示:
在这里插入图片描述

  • 第四轮:

---- 左边
中序:4 【8 6 7 5】
后序:【8 7 6 5】 4
---- 右边
中序:【15 13 14 】12
后序:【15 14 13 】12

第四轮结果如下图所示:
在这里插入图片描述

  • 第五轮:

---- 左边
中序:【8 6 7】 5
后序:【8 7 6】 5
---- 右边
中序:【15 】13 【14 】
后序:【15 14 】13

第五轮结果如下图所示:
在这里插入图片描述

  • 第六轮:

---- 左边
中序:【8 】6 【7】
后序:【8 7 】6

第六轮结果如下图所示:
在这里插入图片描述

总结

在这一章中,介绍了树的概念,以及通过后序遍历和中序遍历退出来的二叉树结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值