数据结构学习⑥--树

本文深入介绍了二叉树的概念,包括节点、度、叶节点等基本元素,以及二叉树的类型如满二叉树和完全二叉树。特别讨论了二叉搜索树的性质,强调了中序周游在排序中的作用。通过递归方法详细解释了如何判断一棵树是否为平衡二叉树,提供了高度计算和平衡检查的递归实现。此外,探讨了树在文件系统索引、字典树和B树等场景中的应用,并提及了树的链表和顺序存储实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关术语

树可以被看做图的一种特例, 即"有向无环图"  

二叉树中每个元素都称为节点。

根节点 (root node)

父节点(parent node)

n个子节点(child node)

节点的度 (degree)

节点所拥有的子树的数目称为该节点的度

叶节点(leaf node)

边 (edge node)

路径 (path)

子树(subtree)

层数(level)

最常见的树--二叉树

最多有两个子节点的树(binary tree)

“二叉树中的度“是指树中最大的结点度,叶子结点是终端结点,是度为 0 的结点。

二叉树的度是指树中所以结点的度数的最大值。二叉树的度小于等于2,因为二叉树的定义要求二叉树中任意结点的度数(结点的分支数)小于等于2 ,并且两个子树有左右之分,顺序不可颠倒。

叶子结点就是度为0的结点,也就是没有子结点的结点叶子。如n0表示度为0的结点数,n1表示度为1的结点,n2表示度为2的结点数。在二叉树中:n0=n2+1;N=n0+n1+n2(N是总结点)。

满二叉树 (full binary tree):

除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。

完全二叉树(Complete Binary Tree)
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

 图1: 完全二叉树 

二叉搜索树

定义 (binary search tree)

  • 递归性质
  • 周游性质: 中序周游的结果是个由小到大的有序排列

深度优先周游

前序周游

中序周游

 后序周游

递归是实现周游的最好方式

广度优先周游

二叉搜索树的基本操作

搜索

找中序周游后序

插入

删除

  • 删除节点是叶节点
  • 删除节点有一个子节点
  • 删除节点有两个子节点 

 高级树结构

平衡二叉树 (balanced tree) 

字典树 (Trie)

 B树

树的实现方式

链表实现

顺序存储

----只适用于完全二叉树

利用下标计算父子关系

  • 对于任何一个二叉树节点, 如果它存储在数组的第i个位置: 父节点为( i - 1)/2, 向上取整
  • 左右子节点分别对应2*i+1和2*i+2

基于搜索的应用

type ahead (字典树)

ordered map (平衡二叉树)

文件系统索引(B树)

判断树的性质

分而治之(递归)

以周游为主

题目:

平衡二叉树 Leetcode_110

这题先看了一眼答案,实际上思路是很好理解的,我们要实现两个递归

1. 递归去判断每个(子)树的深度, 注意,不管数是否平衡,它的高度都是由最深的子树的深度决定的

所以,递归的逻辑是: 父节点的深度 = max(左,右子树的深度)+1

递归的终点是,针对空树, 深度为0

求树的深度的递归实现:

int getHeight(TreeNode* node)
{
    if (!node)
    {
        return 0;
    }
    return (max(getHeight(node->left),getHeight(node->right))+1);
}

2. 递归去判断子树是否为平衡二叉树

判断一棵树是否为平衡二叉树需要满足,

        1. 左右子树的深度差小于等于1

        2. 左右子树需要是平衡二叉树

终止条件, 对于空树,判断它为平衡二叉树= true

判断树是否为平衡二叉树的递归实现:

    bool isBalanced(TreeNode* root) {
        if (!root)
        return  true;
        return (abs(getHeight(root->right)-abs(getHeight(root->left)))<=1\
 &&isBalanced(root->left)&&isBalanced(root->right));

    }

辽大考研复试的一点心得体会辽宁大学于 2020-06-20 06:27:56 发布阅读量2.1k 收藏 16点赞数 4分类专栏: 考研 文章标签: 考研版权考研专栏收录该内容3 篇文章订阅专栏 本文分享了2019年辽宁大学信息学院计算机专业考研复试经历,包括招生计划、复试流程、专业课笔试与面试问题、听力口语考试等内容,提供给准备报考的考生作为参考。摘要由CSDN通过智能技术生成2019年辽宁大学信息学院招生计划: 计算机系统结构4人,计算机软件理论20人,计算机应用技术19人,软件工程(学硕)5人,软件工程(专硕)35人 。关于招生人数方面,学硕基本没有太大变化, 2019年原计划25人扩招到35人 。至于20届不知是否有变化,到时多关注辽大官网即可。每年的考研人数都在上涨,今年国家线相较去年上涨10分,可能由于计算机热度太高,今年专硕的竞争压力蛮大的,所以复试也很重要,当时复试的时候一个软件工程(专硕)的小姐姐坐在我旁边,初试排名第39,基本辽大上不了就没有学校上的情况,但是复试发挥比较好,最后排名35名,正好以最后一名上了,特别开心的回家了。辽大会公布官方初试专业课的题目,以及在成绩出来的时候会公布你的专业排名,关于这两点我是非常喜欢的。今年普遍出现分高排名不高的情况,我身边的好多同学分数挺高的但是不知道自己排名,按照以往分数本以为稳进的,结果最后连复试也没进,如果时间再晚的话,调剂都不太好调剂。关于初试专业课,在19年的专业课试卷没有公布前还是老老实实的看王道打好基础吧,按照今年学硕专业课的情况来看应该光看真题是远远不够的。一、复试基本流程18届复试是3月的最后一周的周四周五两天,19届也是如此。20届如果家比较远的话,需要提前买票可以进行时间的参考。二、具体情况及相关注意事项(一)专业课笔试(C语言)19届复试专业课为笔试,没有机试。虽然官网公布为C语言笔试,但是不仅考了c语言的内容,满分100分,后面40分都是数据结构的题目。无选择填空读程序结果。共8道编程题。分为初级编程6题和高级编程2题。以下为19届学长学姐回忆题目,20届考生可以进行参考。初级:①从键盘上输入数字1-7,输出对应的日期。②计算从100-500的所有素数个数以及其中所有素数之和。③输出5*5矩阵中的最大值和最小值,以及其下标。④从输入的字符串中找出数字,并将其删除后输出。⑤定义结构体typedef struct{int sno;char name [10];}从键盘上输入学生信息,并将其写入文件“student.dat”中,输入学号为0时即停止输入。⑥递归方法写出直接插入排序。高级:(1)关于链表的大题①初始化带头结点的链表A②构造有N个节点的非递减链表③将链表A中不重复的数字复制到链表B中 (2)关于双端队列的大题①初始化队列②关于从队头队尾插入元素的问
最新发布
03-24
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值