求树和二叉树的深度题目及源程序代码
洛谷题解P4913【【深基16.例3】二叉树深度】

洛⾕题解P4913【【深基16.例3】⼆叉树深度】这是⼀道关于⼆叉树的⼊门题。
这题主要考察⼆叉树的存储以及⼆叉树的遍历。
那么我就来分这两部分来讲。
Part 1 存储考虑⼀个⼆叉树的每个节点都有两个⼦节点,所以我们可以考虑⽤⼀个结构体来存储:其中,和分别代表节点的左节点编号和右节点编号。
当读⼊时,就⾮常⽅便了,直接读⼊即可:Part 2 遍历这道题要我们求⼆叉树的深度,就⼀定要遍历这棵树。
⾸先明确⼀点题⽬中未提到的,编号为1的节点是⼆叉树的根节点。
于是我们可以从根节点出发,先递归遍历该节点的左节点,再递归遍历该节点的右节点。
其中还要记录该节点的深度,出发时深度为1每到⼀个节点时更新⼀下深度:到达叶⼦节点时,就总体上就这么多吧。
因为每个节点遍历⼀次,所以总时间复杂度为O (n )AC Codestruct node { int left, right;};node tree[MAXN];left right _for (i, 1, n) cin >> tree[i].left >> tree[i].right;dfs(tree[id].left, deep+1);dfs(tree[id].right, deep+1);ans = max(ans, deep);return if (id == 0) return ;#include <iostream>#define _for(i, a, b) for (int i=(a); i<=(b); i++)using namespace std;const int MAXN = 1e6 + 10;struct node {int left, right;};node tree[MAXN];//存储结构定义int n, ans;void dfs(int id, int deep) {if (id == 0) return ;//到达叶⼦节点时返回ans = max(ans, deep);//更新答案dfs(tree[id].left, deep+1);//向左遍历dfs(tree[id].right, deep+1);//向右遍历}int main() {cin >> n;_for (i, 1, n) cin >> tree[i].left >> tree[i].right;//读⼊+建树dfs(1, 1);//从1号节点出发,当前深度为1cout << ans << endl;//输出答案return 0;//完结撒花!}Processing math: 100%。
猿圈 编程题

猿圈是一个提供编程题和算法挑战的平台,旨在帮助程序员提高自己的编程能力和算法水平。
以下是一些常见的猿圈编程题:
1. 两数之和
给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
2. 反转链表
给定一个单链表,请编写一个函数将其反转,要求空间复杂度为O(1)。
3. 合并两个有序链表
给你两个有序链表,请你将它们合并成一个有序链表。
4. 二叉树的最大深度
给定一个二叉树,请你计算它的深度。
5. 最长回文子串
给你一个字符串s,请你判断它是否是回文串。
如果是,返回true;否则,返回false。
6. 盛最多水的容器
给定n 个非负整数表示每个宽度为 1 的柱子的种类,每种类型i 的柱子至少有minHeight[i] 个。
有n 个高度不同的长方体盒子可供选择,第i 个盒子可以选择放在第j 个柱子上。
所有的盒子都必须放在柱子上,且即使柱子的剩余空间为0,也不允许把盒子放在高度为0 的柱子上。
计算并返回可以存放到箱子中的最大的水体积。
7. 无重叠区间
给定一个区间列表intervals,请你合并所有重叠的区间。
8. 买卖股票的最佳时机II
给定一个数组prices,其中prices[i] 表示一支给定股票第i 天的价格。
设计一个算法来计算你所能获取的最大利润。
你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时购买和出售同一支股票。
求树的深度的算法

求树的深度的算法树是计算机科学中常见的数据结构之一,它由节点和边组成,每个节点可以有多个子节点。
树的深度是指从根节点到最远叶子节点的距离,也可以理解为树的层数。
求树的深度是树相关算法中的一个基础问题。
一、递归算法最简单的方法是使用递归算法。
我们可以定义一个函数,用来计算树的深度。
如果树为空树,则深度为0;否则,树的深度等于左右子树深度的最大值加1。
以下是递归算法的Python代码实现:```pythondef maxDepth(root):if not root:return 0left_depth = maxDepth(root.left)right_depth = maxDepth(root.right)return max(left_depth, right_depth) + 1```二、非递归算法递归算法虽然简单易懂,但是在树很深的情况下会导致栈溢出。
因此,我们可以使用非递归算法来求解。
我们可以使用BFS(广度优先搜索)算法,从根节点开始,一层一层地遍历树,直到遍历到最后一层。
在遍历每一层时,我们将该层的所有节点加入队列中,然后将队列中的节点全部弹出,再将弹出的节点的所有子节点加入队列中。
这样,当遍历到最后一层时,队列中剩余的节点个数即为树的深度。
以下是非递归算法的Python代码实现:```pythondef maxDepth(root):if not root:return 0queue = [root]depth = 0while queue:depth += 1level_size = len(queue)for i in range(level_size):node = queue.pop(0)if node.left:queue.append(node.left)if node.right:queue.append(node.right)return depth```三、时间复杂度和空间复杂度递归算法和非递归算法的时间复杂度均为O(n),其中n为树的节点数。
数据库系统l试题库及答案 第6章 树和二叉树

第6章树和二叉树6.1知识点: 树和二叉树的基本概念一、填空题1.高度为h,度为m的树中至少有___________个结点,至多有______________个结点。
2.树的结点是由及若干指向其子树的组成;结点拥有的子树数称为;度为0的结点称为;度不为0的结点成为;树中结点的最大度数称为;树的最大层次称为_____________。
3.对于一棵具有n个结点的树,该树中所有结点的度数之和为___________。
4.如果结点A有3个兄弟结点,而且B是A的双亲,则B的度是___________。
5.二叉树是另一种树形结构,它的特点是。
6.一颗度数为k且有2k-1个结点的二叉树称为。
7.深度为k,且有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称之为。
8.一棵深度为6的满二叉树有个分支结点和个叶子。
9.一棵具有257个结点的完全二叉树,它的深度为。
10.设一棵完全二叉树具有1000个结点,则此完全二叉树有个叶子结点,有个度为2的结点,有个结点只有非空左子树,有个结点只有非空右子树。
11.由3个结点可以构成__________种形态的的二叉树,可以构成种形态的树。
12.将含有82个结点的完全二叉树从根结点开始顺序编号,根结点为第1号,其他结点自上向下,同一层自左向右连续编号。
则第40号结点的双亲结点的编号为。
13.一棵高度为5的完全二叉树中,最多包含有____________个结点。
14.一棵具有n个结点的二叉树,若它有n0个叶子结点,则该二叉树上度为1的结点n1=____________。
15.在高度为h(h>=0)的二叉树中至多可以有__________个结点,至少可以有___________个结点。
16.n个结点的二叉树最大高度是____________,最小高度是_______________。
二、选择题1.( )不含任何结点的空树()。
A.是一棵树B.是一棵二叉树C.是一棵树也是一棵二叉树D.既不是树也不是二叉树2.()一棵度为4的树中度为1、2、3、4的结点个数为4、3、2、1,则该树的结点总数为()。
求二叉树深度的算法

求二叉树深度的算法算法:二叉树深度问题描述:在计算机科学中,二叉树是一种树状数据结构,每个节点最多有两个子节点,分别为左子节点和右子节点。
给定一棵二叉树,计算其深度。
算法思路:1. 如果根节点为空,那么深度为 0;2. 否则,计算左子树的深度和右子树的深度;3. 取其中的最大值,再加上一,就是整棵二叉树的深度。
例如下图所示的二叉树,其深度为 3。
1/ \2 3/ \4 5算法实现:基于上述算法思路,可以将二叉树深度的算法实现为如下的伪代码:```function BinaryTreeDepth(root)if root == null thenreturn 0elseleftDepth = BinaryTreeDepth(root.left)rightDepth = BinaryTreeDepth(root.right)return max(leftDepth, rightDepth) + 1```其中,`root` 表示二叉树的根节点,`leftDepth` 表示左子树的深度,`rightDepth` 表示右子树的深度,`max` 函数可以返回两个数中的最大值。
根据上述伪代码,可以利用任何一种编程语言来实现二叉树深度的算法。
实测代码实现(Python):下面,给出 Python 语言实现二叉树深度算法的代码:```pythondef Binary_Tree_Depth(root):if root == None:return 0else:leftDepth = Binary_Tree_Depth(root.left)rightDepth = Binary_Tree_Depth(root.right)return max(leftDepth, rightDepth) + 1```该函数接收一个二叉树的根节点作为输入参数,返回整棵二叉树的深度。
总结:二叉树深度算法是计算机科学中的一种基础算法,对于学习数据结构和算法的人来说,是一道必须掌握的算法。
完全二叉树的深度计算公式

完全二叉树的深度计算公式完全二叉树是数据结构中一个很重要的概念。
对于完全二叉树的深度计算,是有特定公式的。
先来说说啥是完全二叉树。
想象一下,一棵大树,它的每一层都被填得满满的,除了最后一层。
而且最后一层的叶子节点,都是从左边开始依次排列的。
这就像是排队,整整齐齐,一个不落。
那完全二叉树的深度咋算呢?公式是:$depth = \lfloor log_2{n}\rfloor + 1$ ,这里的 $n$ 表示完全二叉树的节点个数。
我给您举个例子啊。
比如说有一棵完全二叉树,它一共有 15 个节点。
那咱们先算 $\lfloor log_2{15} \rfloor$ ,这约等于 3 ,再加上 1 ,所以这棵完全二叉树的深度就是 4 。
为啥要有这个公式呢?这就好比咱们盖房子,得知道盖多高心里才有数。
计算完全二叉树的深度,能帮助我们更好地理解和处理这棵“数据之树”。
我记得之前有一次,在给学生们讲这个知识点的时候,有个学生就特别迷糊,怎么都搞不明白。
我就带着他,一步一步地画,一个节点一个节点地数。
我跟他说:“你看啊,这就像咱们搭积木,一层一层来,每一层都有它的规律。
” 最后这孩子恍然大悟,那种成就感,真的让人特别开心。
再回到这个公式,其实理解起来也不难。
$log_2{n}$ 表示的就是以2 为底,$n$ 的对数。
这个对数的值,就相当于完全二叉树去掉最后一层,前面那些层填满的情况下的层数。
再加上 1 ,就是包括最后一层的总深度啦。
在实际应用中,比如在计算机编程里,要优化数据存储和搜索,完全二叉树就大有用处。
通过计算它的深度,能更高效地安排数据的位置,提高程序的运行效率。
总之,完全二叉树的深度计算公式虽然看起来有点复杂,但只要多琢磨琢磨,多练习练习,就一定能掌握。
就像解决生活中的难题一样,只要有耐心,有方法,都能迎刃而解!希望大家都能轻松搞定这个知识点,让数据结构不再成为学习路上的“拦路虎”。
数据结构树和二叉树习题(有答案)

E F D GAB/+ +* - C* 第六章树和二叉树一、选择题1.已知一算术表达式的中缀形式为 A+B*C-D/E ,后缀形式为ABC*+DE/-,其前缀形式为( )A .-A+B*C/DE B. -A+B*CD/E C .-+*ABC/DED. -+A*BC/DE【北京航空航天大学 1999 一、3 (2分)】2.算术表达式a+b*(c+d/e )转为后缀表达式后为()【中山大学 1999 一、5】A .ab+cde/*B .abcde/+*+C .abcde/*++ D.abcde*/++3. 设有一表示算术表达式的二叉树(见下图),它所表示的算术表达式是()【南京理工大学1999 一、20(2分)】A. A*B+C/(D*E)+(F-G)B. (A*B+C)/(D*E)+(F-G)C. (A*B+C)/(D*E+(F-G ))D. A*B+C/D*E+F-G4. 设树T 的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T 中的叶子数为()A .5 B.6 C.7D .8【南京理工大学 2000 一、8 (1.5分)】5. 在下述结论中,正确的是()【南京理工大学 1999 一、4 (1分)】①只有一个结点的二叉树的度为0; ②二叉树的度为2;③二叉树的左右子树可任意交换;④深度为K 的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A .①②③ B .②③④ C.②④D .①④6. 设森林F 对应的二叉树为B ,它有m 个结点,B 的根为p,p 的右子树结点个数为n,森林F中第一棵树的结点个数是()A .m-nB .m-n-1C .n+1D .条件不足,无法确定【南京理工大学2000 一、17(1.5分)】7. 树是结点的有限集合,它((1))根结点,记为T 。
其余结点分成为m (m>0)个((2))的集合T1,T2,…,Tm ,每个集合又都是树,此时结点T 称为Ti 的父结点,Ti 称为T 的子结点(1≤i ≤m )。
树和二叉树习题及答案

树和二叉树习题及答案一、填空题1. 不相交的树的聚集称之为森林。
2. 从概念上讲,树与二叉树是两种不同的数据结构,将树转化为二叉树的基本目的是_树可采用孩子-兄弟链表(二叉链表)做存储结构,目的是利用二叉树的已有算法解决树的有关问题。
3. 深度为k的完全二叉树至少有2 k-1个结点。
至多有2 k-1个结点,若按自上而下,从左到右次序给结点编号(从1开始),则编号最小的叶子结点的编号是2 k-2+1。
4. 在一棵二叉树中,度为零的结点的个数为n,度为2的结点的个数为n2,则有n= n2+1。
5. 一棵二叉树的第i(i≥1)层最多有2 i-1个结点;一棵有n (n>0)个结点的满二叉树共有(n+1)/2个叶子和(n-1)/2个非终端结点。
6.现有按中序遍历二叉树的结果为abc,问有5种不同形态的二叉树可以得到这一遍历结果。
7. 哈夫曼树是带权路径最小的二叉树。
8. 前缀编码是指任一个字符的编码都不是另一个字符编码的前缀的一种编码方法,是设计不等长编码的前提。
9. 以给定的数据集合{4,5,6,7,10,12,18}为结点权值构造的Huffman树的加权路径长度是 165 。
10. 树被定义为连通而不具有回路的(无向)图。
11. 若一棵根树的每个结点最多只有两个孩子,且孩子又有左、右之分,次序不能颠倒,则称此根树为二叉树。
12. 高度为k,且有个结点的二叉树称为二叉树。
2k-1 满13. 带权路径长度最小的二叉树称为最优二叉树,它又被称为树。
Huffman14. 在一棵根树中,树根是为零的结点,而为零的结点是结点。
入度出度树叶15. Huffman树中,结点的带权路径长度是指由到之间的路径长度与结点权值的乘积。
结点树根16. 满二叉树是指高度为k,且有个结点的二叉树。
二叉树的每一层i上,最多有个结点。
2k-1 2i-1二、单选题1. 具有10个叶结点的二叉树中有 (B) 个度为2的结点。
(A)8 (B)9 (C)10 (D)112.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,则可采用_(3)次序的遍历实现编号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
树和二叉树以下问题要求统一在一个大程序里解决。
10、按先序遍历的扩展序列建立二叉树的存储结构11、二叉树先序、中序、后序遍历的递归算法12、二叉树中序遍历的非递归算法13、二叉树层次遍历的非递归算法14、求二叉树的深度(后序遍历)15、建立树的存储结构16、求树的深度17、源程序代码:// tree.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -1typedef char TElemType; // 元素数据类型typedef int Status;/* 二叉链表储存结构*/typedef struct BiTNode {TElemType data;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;bool CreateBiTree(BiTree &T) {//先序序列建立二叉树char ch;scanf("%c",&ch);if (ch=='*') T = NULL;else {if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR; T->data = ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return OK;}Status PrintElement(TElemType e) {// 访问函数printf("%c", e);return OK;}Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //先序遍历二叉树的递归算法if (T) {if (Visit(T->data))if (PreOrderTraverse(T->lchild, Visit))if (PreOrderTraverse(T->rchild, Visit)) return OK;return ERROR;}else return OK;}Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //中序遍历二叉树的递归算法if (T) {if (InOrderTraverse(T->lchild, Visit))if (Visit(T->data))if (InOrderTraverse(T->rchild, Visit)) return OK;return ERROR;}else return OK;}Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //后序遍历二叉树的递归算法if (T) {if (PostOrderTraverse(T->lchild, Visit))if (PostOrderTraverse(T->rchild, Visit))if (Visit(T->data)) return OK;return ERROR;}else return OK;}/* 栈存储结构及操作*/typedef struct {BiTree *base;BiTree *top;int stacksize;}Stack;Status InitStack(Stack &S) {//构造空栈S.base = (BiTree*)malloc(STACK_INIT_SIZE * sizeof(BiTree)); if (!S.base) exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}Status GetTop(Stack S, BiTree &e){//读栈顶元素if (S.top == S.base) return ERROR;e = *(S.top - 1);return OK;}Status Push(Stack &S, BiTree e){//入栈if (S.top - S.base >= S.stacksize) {S.base = (BiTree*)realloc(S.base, (S.stacksize + STACKINCREMENT) *sizeof(BiTree));if (!S.base) exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;}Status Pop(Stack &S, BiTree &e){//出栈if (S.top == S.base) return ERROR;e = *--S.top;return OK;}Status StackEmpty(Stack S){//判栈空if (S.base == S.top) return TRUE;else return FALSE;}Status InOrderTraverse2(BiTree T, Status (*Visit)(TElemType)) { //中序遍历二叉树的非递归算法Stack S;BiTree p;InitStack(S); Push(S, T);while (!StackEmpty(S)) {while (GetTop(S, p) && p) Push(S, p->lchild);Pop(S, p);if (!StackEmpty(S)) {Pop(S, p);if (!Visit(p->data)) return ERROR;Push(S, p->rchild);}}return OK;}#define MAXLEN 100void LevelOrderTraverse(BiTree T, Status (*Visit)(TElemType)) { //层次遍历二叉树struct node{BiTree vec[MAXLEN];int f,r;}q;q.f=0;q.r=0;if (T != NULL) Visit(T->data);q.vec[q.r]=T;q.r=q.r+1;while (q.f<q.r) {T=q.vec[q.f]; q.f=q.f+1;if (T->lchild != NULL) {Visit(T->lchild->data);q.vec[q.r]=T->lchild;q.r=q.r+1;}if (T->rchild != NULL) {Visit(T->rchild->data);q.vec[q.r]=T->rchild;q.r=q.r+1;}}}int BiTreeDepth(BiTree T) {//求二叉树的深度int depthval, depthLeft, depthRight;if (!T) depthval = 0;else {depthLeft = BiTreeDepth( T->lchild );depthRight= BiTreeDepth( T->rchild );depthval = 1 + (depthLeft > depthRight ? depthLeft : depthRight);}return depthval;}/* 树的二叉链表储存结构*/typedef struct CSNode{TElemType data;struct CSNode *firstchild, *nextsibling;} CSNode, *CSTree;/* 队列存储结构及操作*/typedef struct QNode {CSTree data;struct QNode *next;}QNode, *QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;Status InitQueue(LinkQueue &Q) {//构造空队列Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode)); if (!Q.front) exit(OVERFLOW);Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {//销毁队列while (Q.front) {Q.rear = Q.front->next;free(Q.front);Q.front = Q.rear;}return OK;}Status EnQueue(LinkQueue &Q, CSTree e) { //入队QueuePtr p;p = (QueuePtr)malloc(sizeof(QNode));if (!p) exit(OVERFLOW);p->data = e; p->next = NULL;Q.rear->next = p;Q.rear = p;return OK; }Status DeQueue(LinkQueue &Q, CSTree &e) { //出队QueuePtr p;if (Q.front == Q.rear) return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p) Q.rear = Q.front;free(p);return OK;}Status GetHead(LinkQueue &Q, CSTree &e) {//读队头QueuePtr p;if (Q.front == Q.rear) return ERROR;p = Q.front->next;e = p->data;return OK;}CSTree GetTreeNode(TElemType e) {//建立树的孩子//-兄弟链表结点CSTree p;p = (CSTree)malloc(sizeof(CSNode));if (!p) exit(OVERFLOW);p->data = e;p->firstchild = NULL;p->nextsibling = NULL;return p;}Status CreatTree(CSTree &T) {//建立树的孩子//-兄弟链表char first = ' ', second = ' ';int result = 0;LinkQueue Q;CSTree p, s, r;InitQueue(Q);T = NULL;for(scanf("%c%c", &first, &second); second != '#'; result = scanf("%c%c", &first, &second)) {p = GetTreeNode(second); EnQueue(Q, p);if (first == '#') T = p;else {GetHead(Q,s);while (s->data != first) {DeQueue(Q,s); GetHead(Q,s); }if (!(s->firstchild)) {s->firstchild = p;r = p;}else {r->nextsibling = p;r =p;}}}return OK;}int TreeDepth(CSTree T) {//求树的深度int h1, h2;if (!T) return 0;else {h1 = TreeDepth(T->firstchild); h2 = TreeDepth(T->nextsibling); return(((h1+1)>h2)?(h1+1):h2);}}int main(int argc, char* argv[]){BiTree testT;printf("请输入二叉树先序序列(如AB*C***):"); CreateBiTree(testT);printf("\n");printf("二叉树的深度是:");printf("%d", BiTreeDepth(testT));printf("\n");printf("先序递归遍历顺序:"); PreOrderTraverse(testT, PrintElement);printf("\n");printf("中序递归遍历顺序:");InOrderTraverse(testT, PrintElement);printf("\n");printf("后序递归遍历顺序:"); PostOrderTraverse(testT, PrintElement);printf("\n");printf("层次非递归遍历顺序:"); LevelOrderTraverse(testT, PrintElement);printf("\n");printf("中序非递归遍历顺序:"); InOrderTraverse2(testT, PrintElement);printf("\n\n");while (getchar() != '\n'); //清除缓冲区字符CSTree testT2;printf("自上而下自左至右输入树的各条边(如#AABACADCECFEG##):"); CreatTree(testT2);printf("\n");printf("树的深度是:");printf("%d", TreeDepth(testT2));printf("\n");return 0;}。