二叉树面试集锦

合集下载

二叉树相关的面试题

二叉树相关的面试题

二叉树相关的面试题一、二叉树面试题常见类型1. 二叉树的概念二叉树就是每个节点最多有两个子树的树结构,这两个子树被分别称为左子树和右子树。

比如说,我们可以想象成一棵家族树,一个爸爸最多有两个孩子,左孩子和右孩子,这就是二叉树的基本概念啦。

2. 二叉树的遍历有前序遍历、中序遍历和后序遍历哦。

前序遍历就是先访问根节点,再访问左子树,最后访问右子树。

就像我们去旅游先到一个景点的大门(根节点),然后去左边的小景点(左子树),最后去右边的小景点(右子树)。

中序遍历是先左子树,再根节点,最后右子树,这就好比先看左边的小景色,再看大门,最后看右边的小景色。

后序遍历是先左子树,再右子树,最后根节点,就像把两边小景色都看完了,最后再看大门整体的感觉。

3. 二叉树的高度计算二叉树的高度就是从根节点到叶节点最长路径上的节点数。

计算的时候要一层一层地去数,从根开始,一直到最深的叶子那里。

4. 二叉树的平衡判断一棵二叉树是平衡二叉树的话,它的左右两个子树的高度差的绝对值不超过1,并且左右子树都是平衡二叉树。

这就像两边的孩子不能长得太不均衡啦,一边特别高,一边特别矮可不行。

5. 二叉树的构建可以根据给定的遍历序列来构建二叉树。

比如说给了前序遍历和中序遍历的序列,我们就可以通过分析先确定根节点,再根据中序遍历确定左右子树,然后逐步构建出二叉树。

这就像是根据一些线索去拼凑出一个完整的图形一样有趣。

二、二叉树面试题实例1. 题目:给定一个二叉树的前序遍历序列为[1, 2, 4, 5, 3, 6, 7],中序遍历序列为[4, 2, 5, 1, 6, 3, 7],构建出这个二叉树。

解答:首先从前序遍历知道根节点是1,然后在中序遍历中找到1,1左边的[4, 2, 5]就是左子树的中序遍历,右边的[6, 3, 7]就是右子树的中序遍历。

再根据前序遍历中左子树节点的顺序[2, 4, 5],可以确定2是左子树的根节点,然后继续这样分析下去就可以构建出二叉树啦。

js算法面试经典100题

js算法面试经典100题

js算法面试经典100题以下是面试中常见的100个经典算法问题,适用于JavaScript:1. 两数之和2. 反转字符串3. 验证回文串4. 整数反转5. 最长公共前缀6. 合并两个有序数组7. 有效的括号8. 删除排序数组中的重复项9. 删除链表中的节点10. 实现 strStr()11. 替换空格12. 二叉树的最大深度13. 对称二叉树14. 二叉树的层次遍历15. 二叉搜索树的最近公共祖先16. 删除链表的倒数第N个节点17. 旋转数组18. 合并两个有序链表19. 链表的中间节点20. 最大子序和21. 阶乘尾部的零22. 爬楼梯23. 二叉树的前序遍历24. 杨辉三角25. 有效的数独26. 反转链表27. 验证二叉搜索树28. 实现Trie29. 最长有效括号30. 合并区间31. 两两交换链表中的节点32. 下一个排列33. 逆波兰表达式求值34. 最大矩形35. 字符串相乘36. 删除链表中的重复元素37. 螺旋矩阵38. 使用队列实现栈39. 最长连续序列40. 交错字符串41. 单词拆分42. 最后一个单词的长度43. 二叉树的右视图44. 跳跃游戏45. 翻转二叉树46. 字母异位词分组47. 复原IP地址48. 最小覆盖子串49. 丑数50. 栈的压入弹出序列51. 二叉树中和为某一值的路径52. 二叉搜索树的后序遍历序列53. 二进制求和54. 分隔链表55. 不同路径56. 最小路径和57. 字符串转换整数58. 搜索二维矩阵59. 环形链表60. 路径总和61. 删除链表的节点62. 最长上升子序列63. 最大子数组乘积64. 排序链表的合并65. 在排序数组中查找元素的第一个和最后一个位置66. 同结构的二叉树67. 乘积最大子数组68. 两个排序数组的中位数69. 合并K个排序链表70. 数组中的逆序对71. 反转链表的前N个节点72. 最大值和最小值的差73. 翻转字符串中的单词74. 前 K 个高频元素75. 分青红蓝球问题76. 回文数77. 括号生成78. 长度最小的子数组79. 根据身高和序号重组队列80. 两数相加81. 数字的英文表示82. 二叉树的锯齿形层次遍历83. 在O(1)时间内删除链表节点84. 用栈实现队列85. 二叉树的层平均值86. 二叉树的右侧视图87. 螺旋矩阵 II88. 颜色分类89. 寻找重复数90. 打家劫舍91. 按序打印92. 找到字符串中所有字母异位词93. 丑数 II94. 外观数列95. 在排序链表中删除重复元素 II96. 两数相除97. 不同的二叉搜索树98. 最长回文子串99. 缺失的第一个正数100. 寻找最大公约数这些问题涵盖了数据结构和算法中的常见题目。

cvte面试

cvte面试

1、有关系R和S,R∩S等价于(B)A、S-(R-S)B、R-(R-S)C、(R-S)USD、RU(R-S)2、叉树的先序遍历序列和后序遍历序列正好相反,则该二叉树满足的条件是(B)A、空或只有一个结点B、高度等于其结点数C、该二叉树是完全二叉树D、所有结点无右孩子3、下类函数中不是类的成员函数的是()CA、构造B、析构C、友元D、拷贝构造4、假设X是这样的自然数,X能被3整除或者X的个位数是3,那么在1000以内(小于1000),求这样的X的累加之和。

(199701)1 #include<stdio.h>2 int main(){3 int i,sum=0;4 for(i=0;i<=1000;i++){5 if(i%3==0||i%10==3){6 sum=sum+i;7 }8 }9 printf("%d\n",sum);10 scanf("%d",&sum);11 }5、栈的插入和删除操作在(B)进行。

A、栈底B、栈顶C、任意位置D、指定位置定义:栈是规定只能在栈顶插入或删除的线性表,也就是先进后出的规则。

6、某公司数据库密码规定为5位组成的字符串,存储之前,需要将其加密,加密算法为:依次将每个字符依次将每个字符的ASC码值乘以2,再加上10,若计算到的新字符的值等于128,则继续将其除以3,否则不进行除法运算。

最后将该得到的新字符串中所有字符前后互换(第一位和最后一位,第二位和倒数第二位交换,依次交换),编程求字符串“abcde”加密后的字符串。

(FFEDD)1 #include<stdio.h>2 #include <string.h>3 int main(){4 char pwd[]="abcde",temp;5 int len=strlen(pwd);6 /*赋值*/7 for(int i=0;i<len;i++){8 printf("%c\n",pwd);9 if((pwd*2+10)>=128){10 pwd=(pwd*2+10)/3;11 printf("大于或等于%c\n",pwd);12 }13 else{14 pwd=(pwd*2+10);15 printf("小于%c\n",pwd);16 }17 }18 /*交换*/19 for(int j=0;j<len/2;j++){20 temp=pwd[j];21 pwd[j]=pwd[len-j-1];22 pwd[len-j-1]=temp;23 }24 /*打印出来*/25 for(int j=0;j<len;j++){26 printf("最终%c\n",pwd[j]);27 }28 /*预留输入*/29 scanf("%d",&len);30 }7、为了有效的捕获系统需求,应采用(C)A、瀑布模型B、V 模型C、原型模型D、螺旋模型8、写出下面程序的运行结果(3667788)1 #include<stdio.h>23 void main(){4 int c;5 char aa[]="12345";6 char *p=aa;78 while(*p){9 c=*p;10 switch(c-'2'){11 case 0:12 case 1:putchar(c+4);13 case 2:putchar(c+4);break;14 case 3:putchar(c+3);break;15 default:putchar(c+2);break;16 }17 p++;18 }19 printf("\n");20 }9、C#中关于构造函数描述正确的是(C)A、构造函数可以声明返回类型B、构造函数不可以用private修饰C、构造函数必须与类名相同D、构造函数不能带参数10、下面哪个是无线网络协议(C)A、ADSLB、100BaseTC、WiMaxD、1000BaseT11、有关析构函数的说法不正确的是( C)。

c++数据结构面试题

c++数据结构面试题

c++数据结构面试题以下是一些常见的C++数据结构面试题,它们涵盖了各种数据结构和算法的概念。

这些问题有助于评估面试者对C++语言和数据结构的理解:1. 链表操作:•反转一个单链表。

•检测链表中是否存在环。

•合并两个有序链表。

2. 树和二叉树:•二叉树的深度(高度)计算。

•判断一棵二叉树是否是平衡二叉树。

•实现二叉树的前序、中序和后序遍历。

3. 数组和字符串:•在数组中找到两个数的和等于特定目标值。

•字符串反转。

•判断一个字符串是否是另一个字符串的排列。

4. 堆和队列:•实现一个最小堆。

•使用两个栈实现一个队列。

•实现一个优先队列。

5. 图:•深度优先搜索(DFS)和广度优先搜索(BFS)的实现。

•拓扑排序。

•判断图是否是二分图。

6. 排序和查找:•实现快速排序。

•在旋转有序数组中搜索一个元素。

•实现二分查找算法。

7. 动态规划:•计算斐波那契数列。

•最长递增子序列。

• 0/1背包问题。

8. 哈希表:•实现一个哈希表。

•查找数组中重复的元素。

•判断两个字符串是否是字母异位词。

9. 其他:• LRU(最近最少使用)缓存算法的实现。

• KMP字符串匹配算法。

这些问题涵盖了数据结构的许多方面,包括链表、树、数组、字符串、堆、队列、图、排序、查找、动态规划和哈希表等。

当准备C++数据结构面试时,深入理解这些问题并进行实际的编程练习将对提高面试表现非常有帮助。

数据结构经典面试题目

数据结构经典面试题目

数据结构经典⾯试题⽬1.数组和链表的区别,请详细解释。

从逻辑结构来看:a) 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。

当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。

b) 链表动态地进⾏存储分配,可以适应数据动态地增减的情况,且可以⽅便地插⼊、删除数据项。

(数组中插⼊、删除数据项时,需要移动其它数据项,⾮常繁琐)链表必须根据next指针找到下⼀个元素从内存存储来看:a) (静态)数组从栈中分配空间, 对于程序员⽅便快速,但是⾃由度⼩b) 链表从堆中分配空间, ⾃由度⼤但是申请管理⽐较⿇烦从上⾯的⽐较可以看出,如果需要快速访问数据,很少或不插⼊和删除元素,就应该⽤数组;相反,如果需要经常插⼊和删除元素就需要⽤链表数据结构了。

2.排序算法有哪些?< C语⾔总共有多少种排序法>排序算法有很多,每种算法有不同的时间和空间复杂度,效率也有差别,那么针对使⽤上也有不同的场合。

原则上说,数据结构是⼀门领域,跟语⾔没有绝对的联系,很多时候同样的算法可以⽤很多种语⾔实现。

下⾯列⼀些常见的算法:插⼊排序,冒泡排序,选择排序,快速排序,堆排序,归并排序,基数排序,希尔排序等。

3.怎么理解哈希表,哈希表是什么摘⾃百度:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)⽽直接进⾏访问的数据结构。

也就是说,它通过把关键码值映射到表中⼀个位置来访问记录,以加快查找的速度。

这个映射函数叫做散列函数,存放记录的数组叫做散列表。

给定表M,存在函数f(key),对任意给定的关键字值key,代⼊函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash)函数4.请写出以下算法的时间复杂度冒泡排序法插⼊排序法堆排序法⼆叉树排序法O(n^2) O(n^2) O(nlog2 n) 最差O(n2)平均O(n*log2n)快速排序法希尔排序法最差O(n2)平均O(n*log2n) O(nlog n)不稳定5.数据结构,⼆叉树的相关知识,开销量,为何使⽤⼆叉树等。

经典数据结构面试题(含答案)

经典数据结构面试题(含答案)

栈与队列得共同特点就是__________________________、栈通常采用得两种存储结构就是______________________、用链表表示线性表得优点就是_______________________8、在单链表中,增加头结点得目得就是___________________ﻫ9、循环链表得主要优点就是________________________-12、线性表得顺序存储结构与线性表得链式存储结构分别就是__________________________13、树就是结点得集合,它得根结点数目就是_____________________14、在深度为5得满二叉树中,叶子结点得个数为_______________ﻫ15、具有3个结点得二叉树有(_____________________16、设一棵二叉树中有3个叶子结点,有8个度为1得结点,则该二叉树中总得结点数为____________________17、已知二叉树后序遍历序列就是dabec,中序遍历序列就是debac,它得前序遍历序列就是____________________________18、已知一棵二叉树前序遍历与中序遍历分别为ABDEGCFH与DBGEACHF,则该二叉树得后序遍历为______________________19、若某二叉树得前序遍历访问顺序就是abdgcefh,中序遍历访问顺序就是dgbaec hf,则其后序遍历得结点访问顺序就是_______________________ﻫ20、数据库保护分为:安全性控制、完整性控制、并发性控制与数据得恢复。

在计算机中,算法就是指_______________________算法一般都可以用哪几种控制结构组合而成_____________________、算法得时间复杂度就是指______________________5、算法得空间复杂度就是指__________________________ﻫ6、算法分析得目得就是__________________________11、数据得存储结构就是指_________________________12、数据得逻辑结构就是指(_______________________________ﻫ13、根据数据结构中各数据元素之间前后件关系得复杂程度,一般将数据结构分为__________________________________16、递归算法一般需要利用_______________________实现。

二叉树常见面试题(进阶)

⼆叉树常见⾯试题(进阶)⼀、常见题型1. 求两个节点的最近公共祖先;2. 求⼆叉树中最远的两个节点的距离;3. 由前序遍历和中序遍历重建⼆叉树(如:前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5);4. 判断⼀棵树是否是完全⼆叉树;5. 将⼆叉搜索树转换成⼀个排序的双向链表。

要求不能创建任何新的结点,只能调整树中结点指针的指向;6.求⼆叉树的宽度;7. 判断⼀棵⼆叉树是否是平衡⼆叉树;8.判断⼀颗⼆叉树是否是另⼀颗树的⼦树。

⼆、解题思路分析1.两个节点的最近公共祖先求两个节点的最近公共祖先可分为三种情况,分别为:(1)求搜索⼆叉树的最近公共祖先。

根据搜索⼆叉树的性质,左⼦树的所有节点⽐根节点⼩,右⼦树的所有节点⽐跟节点⼤。

如果两个节点都⽐根节点⼩,则递归左⼦树;如果两个节点都⽐跟节点⼤,则递归右⼦树;否则,两个节点⼀个在左⼦树,⼀个在右⼦树,则当前节点就是最近公共祖先节点。

1 Node* GetAncestor(Node* root, Node* x1, Node* x2)//1.该⼆叉树为搜索⼆叉树2 {3 assert(x1 && x2);4if (x1->_data <= root->_data && x2->_data <= root->_data)5 {6return GetAncestor(root->_left, x1, x2);//两个节都⼩于根节点,最近公共祖先在左⼦树中7 }8else if (x1->_data > root->_data && x2->_data > root->_data)9 {10return GetAncestor(root->_right, x1, x2);//两个节都⼤于根节点,最近公共祖先在左⼦树中11 }12else13return root; //⼀个在左⼦树,⼀个在右⼦树,找到公共祖先1415 }(2)三叉链,带⽗节点时求最近公共祖先,⼆叉树节点有指向⽗节点的指针。

数据结构常用面试题

1、以下哪种数据结构常用于实现栈?A、链表B、数组C、二叉树D、哈希表(答案:B)2、在二叉搜索树中,若一个节点的左子树不为空,则左子树上所有节点的值都____该节点的值。

A、大于B、小于C、等于D、不确定(答案:B)3、队列这种数据结构遵循的访问原则是?A、先进先出B、后进先出C、随机访问D、按优先级访问(答案:A)4、图数据结构中,用来表示图中顶点之间关系的元素称为?A、顶点B、边C、路径D、环(答案:B)5、以下哪种数据结构最适合用于快速查找操作?A、链表B、栈C、哈希表D、队列(答案:C)6、在顺序存储的线性表中,第i个元素的存储地址是?A、随机的B、与i无关C、通过计算首地址和i的关系得到D、由用户自定义(答案:C)7、下列关于二叉树遍历的说法中,错误的是?A、前序遍历首先访问根节点B、中序遍历对于任何节点,其左子树节点先于该节点被访问C、后序遍历的最后一个被访问的节点是根节点D、层次遍历是从根节点开始,自上而下逐层遍历(答案:D)8、以下哪种情况不会导致二叉搜索树退化成链表?A、插入的元素按递增顺序B、插入的元素按递减顺序C、随机插入元素D、插入的元素先递增后递减(答案:C)9、在哈希表中,解决冲突的方法不包括?A、开放寻址法B、链地址法C、再哈希法D、二分查找法(答案:D)10、关于树的深度优先搜索(DFS),以下描述错误的是?A、DFS需要使用栈来辅助实现B、DFS可以遍历图或树的所有节点C、DFS对于每个节点只访问一次D、DFS总是先访问深度最深的节点(答案:D)。

本科计算机面试题库及答案

本科计算机面试题库及答案一、数据结构与算法1. 请解释什么是数据结构。

数据结构是一种组织和存储数据的方式,不仅包括数据的存储结构,还包括对数据的操作和管理。

2. 什么是栈和队列?它们有什么区别?栈是一种先进后出(Last In First Out,LIFO)的数据结构,只能在栈顶进行插入和删除操作。

而队列是一种先进先出(First In First Out,FIFO)的数据结构,可以在队列的两端进行插入和删除操作。

3. 请解释什么是二叉树,并给出一个例子。

二叉树是一种特殊的树结构,每个节点最多有两个子节点,即左子节点和右子节点。

例如,下图所示的二叉树:1/ \2 3/ \4 54. 请解释什么是排序算法,并列举一些常见的排序算法。

排序算法是对一组数据进行重新排序的方法。

常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序和归并排序等。

5. 快速排序是如何工作的?快速排序是一种常用的排序算法。

基本思想是选择一个基准元素,将小于基准元素的元素移到基准元素的左边,将大于基准元素的元素移到基准元素的右边,然后对左右两部分分别进行递归排序。

二、操作系统1. 什么是进程和线程?它们有什么区别?进程是计算机中正在运行的程序的实例,具有独立的内存空间和系统资源。

线程是进程中的执行单元,共享进程的内存空间和系统资源。

进程之间相互独立,线程之间共享资源。

2. 请解释什么是死锁,并给出一个例子。

死锁是指两个或多个进程互相等待对方持有的资源,导致程序无法继续执行的情况。

例如,进程A正在等待进程B持有的资源X,而进程B正在等待进程A持有的资源Y。

3. 什么是虚拟内存?虚拟内存是计算机系统用于管理和操作内存的技术,它将物理内存和磁盘空间结合起来,可以将部分数据存储在磁盘上,以释放物理内存空间。

4. 请解释什么是页面替换算法,并给出一个例子。

页面替换算法是操作系统用于管理虚拟内存中页面的算法。

常见的页面替换算法包括最佳(OPT)、先进先出(FIFO)和最近最久未使用(LRU)等。

电网计算机类面试题及答案

电网计算机类面试题及答案面试是很多求职者必经的环节,对于计算机行业的求职者来说,面试的内容和形式也有所不同。

面试题通常考察个人对计算机技术的理解和应用能力。

本文将介绍一些常见的电网计算机类面试题及答案,希望能为求职者提供一些参考。

一、网络基础知识1. 什么是IP地址?IP地址有几种类型?答:IP地址是Internet Protocol Address的缩写,是为了使网络中的设备进行互联而设计的一种协议。

IP地址包括32位,例如192.168.0.1。

IP地址有两种类型,一种是IPv4,另一种是IPv6。

2. 什么是子网掩码?它有什么作用?答:子网掩码用于划分网络中主机和网络部分。

它与IP地址一起使用,用于确定网络中的主机和网络部分。

子网掩码的作用是在IP地址中标识网络部分和主机部分,以便于网络数据的传输和路由。

3. 什么是MAC地址?MAC地址有多少位?答:MAC地址是Media Access Control Address的缩写,是网络设备的唯一标识符。

MAC地址由48位二进制数表示,通常以6个十六进制数表示,例如00:0c:29:36:4e:58。

二、操作系统相关1. 什么是操作系统?列举几种常见的操作系统。

答:操作系统是一种控制和管理计算机硬件和软件资源的程序。

常见的操作系统包括Windows、Linux、macOS等。

2. 什么是进程和线程的区别?答:进程是指计算机中正在运行的一个程序,它有自己的内存空间、文件描述符和系统资源。

而线程是进程中的一个执行单元,多个线程可以共享进程的资源,它们共享同一片内存空间。

3. 什么是死锁?如何解决死锁问题?答:死锁是指两个或多个进程互相等待对方所持有的资源,导致程序无法继续执行的情况。

解决死锁问题的方法通常有预防死锁、避免死锁和检测与恢复。

三、数据结构与算法1. 什么是栈和队列?它们有什么区别?答:栈是一种先进后出(LIFO)的数据结构,只允许在栈顶进行插入和删除操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//3.中序遍历 void //4.后序遍历 void //5.层次遍历 void //6.获得叶子节点的个数 int //7.获得二叉树的高度 int //8.交换二叉树的左右儿子 void //9.求两个节点 pNode1 和 pNode2 在以 r 为树根的树中的最近公共祖先
BinTreeNode* get_nearest_common_father(BinTreeNode *r,BinTreeNode *pNode1,BinTreeNode *pNode2)const;
BinTree::pre_order(BinTreeNode *r)const BinTreeNode *pTmpNode = if(pTmpNode != NULL)
r;
cout<<pTmpNode->get_data()<<" "; pre_order(pTmpNode->get_left()); pre_order(pTmpNode->get_right());
BinTree::get_leaf_num(BinTreeNode *r)const
if(r
== NULL)//该节点是空节点,比如建树时候用'#'表示
&& r->get_right()==NULL)//该节点并不是空的,但是
没有孩子节点
get_leaf_num(r->get_left()) + get_leaf_num(r->get_right());
l;
}
BinTreeNode* get_left()const
{ return left;
set_right(BinTreeNode *r) right =
r;
}
BinTreeNode* get_right()const
{ return right;
};
二叉树原型:BinTree,其中包含了这篇文章中要完成的函数原型的完整 声明。
BinTreeNode *t,*t_l,*t_r; cin>>item; if(item != '#') BinTreeNode *pTmpNode = t = pTmpNode; t_l = create_tree(); t->set_left(t_l); t_r = create_tree(); t->set_right(t_r);
View Code 1 //二叉树 2 class BinTree 3 { 4 private: 5 BinTreeNode 6 public: 7 8
*root;
NULL):root(t){};
BinTree(BinTreeNode *t = ~BinTree(){delete root;};
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
}; 2.1 创建一颗二叉树
创建一颗二叉树,可以创建先序二叉树,中序二叉树,后序二叉树。我们在 创建的时候为了方便,不妨用‘#’表示空节点,这时如果先序序列是:6 4 2 3 # # # # 5 1 # # 7 # #,那么创建的二叉树如下:
下面是创建二叉树的完整代码:穿件一颗二叉树,返回二叉树的根。
BinTree::get_tree_height(BinTreeNode *r)const == NULL)//节点本身为空
&& r->get_right()==NULL)//叶子节点
11 12 13 14 15
}
l_height = get_tree_height(r->get_left()); int r_height = get_tree_height(r->get_right()); return l_height >= r_height ? l_height + 1 : r_height +
return t; new
BinTreeNode(item-48);
t =
NULL; return t;
} 2.2 二叉树的遍历
二叉树的遍历分为:先序遍历,中序遍历和后序遍历,这三种遍历的写法是 很相似的,利用递归程序完成也是灰常简单的:
View Code 1 //前序遍历 2 void 3 { 4 5 6 7 8 9 10 11 } 12 //中序遍历 13 void 14 { 15 } {
二叉树中的那些面试题
再具体说二叉树中的那些面试题之前, 我们先看一下二叉树中的每个节点是 什么样的,以及为了完成这些面试题,二叉树中声明的函数原型是什么样的: 二叉树的节点:BinTreeNode
View Code 1 //二叉树的节点类 2 class BinTreeNode 3 { 4 private: 5 int data;
}
23 //后序遍历 24 void 25 { 26 27 28 29 30 31 32 33 } { if(pTmpNode
BinTree::post_order(BinTreeNode *r)const BinTreeNode *pTmpNode = != NULL)
r;
post_order(pTmpNode->get_left()); post_order(pTmpNode->get_right()); cout<<pTmpNode->get_data()<<" "; } 2.3 层次遍历
} 2.5 求二叉树的高度
求二叉树的高度也是非常简单, 不用多说: 树的高度 = max(左子树的高度, 右子树的高度) + 1 。
View Code 1 //获得二叉树的高度 2 int 3 { 4 5 6 7 8 9 10 } if(r->get_left()==NULL { return 1; { return 0; if(r
BinTree::in_order(BinTreeNode *r)const BinTreeNode *pTmpNode =
r;
16 17 18 19 20 21 22 }
if(pTmpNode {
!=
NULL)
in_order(pTmpNode->get_left()); cout<<pTmpNode->get_data()<<" "; in_order(pTmpNode->get_right());
二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。 昨天看了一下关于树中的面试题, 发现二叉树中的面试题比较常见的题型大概有 下面几个:创建一颗二叉树(先序,中序,后序)、遍历一颗二叉树(先序,中 序,后序和层次遍历)、求二叉树中叶子节点的个数、求二叉树的高度、求二叉 树中两个节点的最近公共祖先、 打印和为某一值的全部路径、求某一节点是否在 一个树中等等。 再详细的说这些面试题之前,不妨先看一下几种常见的二叉树: 完全二叉树:若二叉树的高度是 h,除第 h 层之外,其他(1~h-1)层的节 点数都达到了最大个数, 并且第 h 层的节点都连续的集中在最左边。想到点什么 没?实际上,完全二叉树和堆联系比较紧密哈~~~ 满二叉树:除最后一层外,每一层上的所有节点都有两个子节点,最后一层 都是叶子节点。 哈夫曼树:又称为最有数,这是一种带权路径长度最短的树。哈夫曼编码就 是哈夫曼树的应用。 平衡二叉树:所谓平衡二叉树指的是,左右两个子树的高度差的绝对值不超 过 1。 红黑树:红黑树是每个节点都带颜色的树,节点颜色或是红色或是黑色,红 黑树是一种查找树。 红黑树有一个重要的性质,从根节点到叶子节点的最长的路 径不多于最短的路径的长度的两倍。对于红黑树,插入,删除,查找的复杂度都 是 O(log N)。
}
} 2.4 求二叉树中叶子节点的个数
树中的叶子节点的个数 = 左子树中叶子节点的个数 + 右子树中叶子节点 的个数。利用递归代码也是相当的简单,易懂。
View Code 1 //获取叶子节点的个数 2 int 3 { 4 5 6 7 8 9 10 11 12 13 14 } //递归整个树的叶子节点个数 = 左子树叶子节点的个数 + 右子树叶子节点的个数 return { return 1; } if(r->get_left()==NULL { return 0;
6 BinTreeNode 7 public: 8 9
பைடு நூலகம்
*left,*right;
//利用初始化列表完成 data,left,rightn 的初始化
BinTreeNode(const int &item,BinTreeNode *lPtr = NULL,BinTreeNode *rPtr = NULL):data(item) ,left(lPtr),right(rPtr){}; 10 void set_data(int item)
View Code
1 //创建二叉树,这里不妨使用前序创建二叉树,遇到‘#’表示节点为空 2 BinTreeNode* BinTree::create_tree() 3 { 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 } { } else { char item;
BinTree::level_order(BinTreeNode *r)const
if(r
==
NULL)
return;
deque<BinTreeNode*>
q.push_back(r); while(!q.empty())
q;
BinTreeNode *pTmpNode = q.front(); cout<<pTmpNode->get_data()<<" ";
相关文档
最新文档