数据结构面试刷题

本文深入解析了树和图的计算技巧,包括二叉树、完全二叉树、四叉树的节点计算,哈夫曼树的构造及带权路径长度计算,以及森林与树的转换,图的边数计算,强连通图与拓扑排序的理解。通过实例,详细解释了各种计算方法和原理。

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

树的计算题技巧:

1.在二叉树的第i层至多有2^i - 1 个节点

2.深度为k的二叉树至多有2^k-1 个节点

3. 设度为0,1,2节点为n0,n1,n2,总结点是n,则n0=n2+1;(根据4.5条推出)

4.n0 + n1 + n2 = n

5.n = 分支线数 + 1 = 2*n2 + 1*n1 + 0*n0分支数就是两点的连线的数目,n个点两两连线有n-1条线)

满二叉树:最后一层节点有2^i - 1个节点,就是满了

完全二叉树:对满二叉树进行编号与对完全二叉树进行编号顺序位置完全一样,唯一不同就是完全二叉树最后一层叶子节点比满少

1.节点计算题


一个4叉树,度为4的结点个数为6,度为3的节点个数是10,度为2的节点个数是5,叶子节点个数为()

虽然不是二叉树,但是延伸的道理都是一样的。

设度为1的节点个数为x,度为0的节点为y。该树的分叉数为4*6+3*10+2*5+x*1
又因为节点数=分叉数+1;
节点数:6+10+5+x+y= 4*6+3*10+2*5+x*1+1
解得:y=44

某棵完全二叉树上有699个节点,则该二叉树的叶子节点数为()

完全二叉树,n1的个数在1和0之前选择我们用分支数的公式

2*n2 + n1 + 1 = 699,1移过去后698是复数,很明显如果n1是1,那么n2肯定不是整数,所以n1只能是0,然后算出n2是349;然后根据公式2,n2 = n0 - 1算出n0 = 350

一个包含 n 个节点的四叉树,每个节点都有四个指向孩子节点的指针,这 4n 个指针中有多少个空指针?

答案:n个节点不管多少叉树,肯定有n-1条连线(边),意味着有n-1个非空指针

所以空指针就是4n-(n-1) = 3n+1

2.哈弗曼树

官方定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

若以{4,5,6,7,8}作为叶子结点的权值构造哈夫曼树,则其带权路径长度是()。

构造方法是每次取最小的两个数, 合并成一个数, 然后循环这种做法, 直到只剩一个点为止。构造的树是 
30 
17 13 
8 9 6 7 
4 5

3.森林与树

树转二叉树

森林转二叉树
设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是(     )

答案:M2+M3

 


图的计算技巧

1.n个顶点的无向完全图有n*(n-1)/2条边

2.n个顶点的有向完全图有n*(n-1)条边

3.无向图边数是各顶点度数和一半

完全图:任意两个顶点都存在边

1.图与边

设某强连通图中有 n 个顶点,则该强连通图中 至少有()条边。

答案:n条

1)强连通图的定义:

在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。

2)分析:

可知当n个节点的图构成一个环,任意两点之间存在着回路,于是最小的边数为n;最大边数为n(n-1);

2.拓扑

在有向图G的拓扑序列中,若顶点Vi在顶点Vj之前,则下列情形不可能出现的是()。
A.G中有弧<Vi,Vj>
B.G中有一条从Vi到Vj的路径
C.G中没有弧<Vi,Vj>
D.G中有一条从Vj到Vi的路径

答案:D

拓扑排序定义:将有向图中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边u->v,在最后的排序结果中,顶点u总是在顶点v的前面

比如下面的图的拓扑结构是V1,V3,V4,V6,V2,V5,V7

不是所有图都能被拓扑,拓扑排序的充要条件就是它是一个有向无环图

https://blog.youkuaiyun.com/jinzhao1993/article/details/51778468

### 关于数据结构的方法与资源推荐 #### 1. 学习基础理论 在开始之前,建议先掌握扎实的基础知识。可以通过在线教程了解数据结构的核心概念和常见算法。例如,菜鸟教程提供了详尽的数据结构与算法讲解[^1],适合初学者入门。 #### 2. 使用经典教材配套练习 经典的《数据结构》书籍(如严蔚敏版本)通常附带大量习。可以参考相关试卷资料进行针对性训练[^2]。这些试卷涵盖了从简单到复杂的各类目,能够帮助巩固知识点并提升解能力。 #### 3. 利用专业平台 以下是几个高质量的网站: - **LeetCode**: 提供丰富的算法挑战,覆盖多种难度级别,并支持多语言提交解决方案。 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # 示例:链表反转函数 def reverseList(head: ListNode) -> ListNode: prev = None curr = head while curr is not None: temp = curr.next curr.next = prev prev = curr curr = temp return prev ``` - **牛客网(NiuKe)**: 面向国内求职者设计,包含众多企业面试和技术笔试模拟赛。 - **Codeforces & AtCoder**: 这两个国际竞赛型站点非常适合希望提高竞技水平的学习者尝试更复杂场景下的逻辑思考。 #### 4. 动态可视化工具辅助理解 对于某些抽象的概念或者过程难以想象的情况,“数据结构和算法动态可视化”这样的交互式学习工具有助于直观感受操作流程。 #### 5. 实践项目驱动学习 除了单纯做外,还可以通过完成实际工程项目来应用所学的知识点。比如构建一个简单的文件管理系统需要用到栈、队列等;开发社交网络可能涉及图论等方面的内容。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值