104. Maximum Depth of Binary Tree

本文介绍了三种不同的算法实现方式来求解二叉树的最大深度:递归、深度优先搜索(DFS)及广度优先搜索(BFS)。递归方法直接通过函数调用计算左右子树的深度;DFS使用栈来迭代遍历树节点并记录深度;BFS则利用队列进行层次遍历,同样记录节点深度。

递归

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==0)
            return 0;
        return 1+max(maxDepth(root->left), maxDepth(root->right));/*root!=NULL depth>=1*/
    }
};

DFS

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==NULL)
            return 0;
        stack<TreeNode*> nodes; //save traversal nodes
        int result=0;   //save max depth of node
        nodes.push(root);
        root->val=1;
        while(nodes.size()>0)
        {
            TreeNode* top=nodes.top();
            nodes.pop();
            int curDepth=top->val;
            result=result>curDepth?result:curDepth;
            if(top->left!=NULL)
            {
                nodes.push(top->left);
                top->left->val=curDepth+1;
            }
            if(top->right!=NULL)
            {
                nodes.push(top->right);
                top->right->val=curDepth+1;
            }
        }
        return result;
    }
};

BFS

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==NULL)
            return 0;
        queue<TreeNode*> nodes;
        nodes.push(root);
        root->val=1;
        int result=0;
        while(nodes.size())
        {
            TreeNode *fro=nodes.front();
            int curdepth=fro->val;
            nodes.pop();
            result=result>curdepth?result:curdepth;
            if(fro->left)
            {
                nodes.push(fro->left);
                fro->left->val=curdepth+1;
            }
            if(fro->right)
            {
                nodes.push(fro->right);
                fro->right->val=curdepth+1;
            }
        }
        return result;
    }
};
源码来自:https://pan.quark.cn/s/41b9d28f0d6d 在信息技术领域中,jQuery作为一个广受欢迎的JavaScript框架,显著简化了诸多操作,包括对HTML文档的遍历、事件的管理、动画的设计以及Ajax通信等。 本篇文档将深入阐释如何运用jQuery达成一个图片自动播放的功能,这种效果常用于网站的轮播展示或幻灯片演示,有助于优化用户与页面的互动,使网页呈现更加动态的视觉体验。 为了有效实施这一功能,首先需掌握jQuery的核心操作。 通过$符号作为接口,jQuery能够迅速选取DOM组件,例如$("#id")用于选取具有特定ID的元素,而$(".class")则能选取所有应用了某类class的元素。 在选定元素之后,可以执行多种行为,诸如事件监听、样式的变更、内容的更新以及动画的制作等。 关于“一个基于jQuery的图片自动播放功能”,首要任务是准备一组图片素材,这些素材将被整合至一个容器元素之中。 例如,可以构建一个div元素,将其宽度设定为单张图片的尺寸,再借助CSS实现溢出内容的隐藏,从而构建出水平滚动的初始框架。 ```html<div id="slider"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <!-- 更多图片内容... --></div>```接着,需要编写jQuery脚本以实现图片的自动切换。 这通常涉及到定时器的运用,以设定周期性间隔自动更换当前显示的图片。 通过使用`.fadeOut()`和`.fadeIn()`方法,能够实现图片间的平滑过渡,增强视觉效果。 ```javascript$(document).re...
根据原作 https://pan.quark.cn/s/eb05e63067ef 的源码改编 Vulkan在现代图形编程领域被视为一种高效且低层级的API,它赋予开发者对硬件资源的直接支配权,从而在游戏开发、专业级渲染以及计算密集型应用中达成卓越的性能表现。 MoonVulkan作为一个针对Vulkan API的Lua语言绑定库,显著简化了使用Lua来编写Vulkan图形程序的过程。 Lua作为一种轻量级脚本语言,因其语法精炼且易于集成,经常被应用于游戏开发以及其他需要快速构建原型设计的场景。 MoonVulkan的核心宗旨是将Vulkan的强大功能引入Lua编程环境,使得开发者能够借助Lua的简洁语法来处理复杂的图形作业。 这个库提供了一套完整的Vulkan函数和结构体的Lua接口,使得Lua程序员可以直接运用Vulkan API的各类功能,例如构建设备、管理交换链、提交命令缓冲区等操作。 在MoonVulkan框架内,开发者可以运用Lua的动态属性,例如在执行期间检查错误、执行条件性判断以及循环操作,这些在C++或C语言中通常需要编写大量的辅助代码才能完成。 再者,得益于Lua的脚本特性,MoonVulkan支持热更新机制,即在程序运行过程中可以调整图形逻辑,无需对整个项目进行重新编译。 在运用MoonVulkan时,有几个关键性概念需要掌握:1. **Vulkan的初始化设置**:必须配置Vulkan实例,这是所有Vulkan操作的基础环节。 这包含选取物理设备(代表GPU)、构建一个恰当的实例配置,并妥善处理所需的扩展和层。 2. **表面的构建**:在桌面平台环境下,这通常涉及与窗口系统的互动,以获取一个象征屏幕输出的VkSurfaceKHR对象。 3. **图形与计算队列的选择...
基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨了在缺乏机械位置传感器条件下,如何通过算法实现对电机转子位置与速度的精确估算,从而实现高性能的电机控制。文中可能涉及如滑模观测器、扩展卡尔曼滤波、高频注入法或反电动势法等核心观测技术,并结合STM32 F4高性能处理器的硬件平台进行算法实现与实验验证,旨在提升系统可靠性与降低成本。此外,研究还可能涵盖磁场定向控制(FOC)框架下的电流环、速度环控制策略设计与优化。; 适合人群:具备一定电机控制理论基础和嵌入式开发经验,从事电机驱动、电力电子或自动化相关方向的研究生、工程师及科研人员。; 使用场景及目标:①用于永磁同步电机驱动系统中替代传统位置传感器,提高系统鲁棒性和集成度;②适用于对体积、成本和可靠性要求较高的工业控制、新能源汽车、无人机、家电等领域;③目标是掌握无感控制的核心算法原理与工程实现方法,完成从理论到实际系统的搭建与调试。; 阅读建议:建议结合电机控制基础知识与STM32开发环境进行学习,重点关注观测器设计与参数整定部分,配合仿真模型与实物代码进行验证,深入理解算法在实际运行中的动态响应与抗干扰能力。
nsert 2, 1, 4, 5, 9, 3, 6, 7 into an initially empty AVL tree. Which one of the following statements is FALSE? A. 4 is the root B. 3 and 7 are siblings C. 2 and 6 are siblings D. 9 is the parent of 7 分数 3 作者 陈越 单位 浙江大学 如果AVL树的深度为5(空树的深度定义为0),则此树最少有多少个结点? A. 12 B. 20 C. 33 D. 64 分数 2 作者 徐镜春 单位 浙江大学 将 7, 8, 9, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的? A. 7 是根结点 B. 2 和 5 是兄弟 C. 有2个结点的平衡因子为-1 D. 3 是 4 的父结点 分数 2 作者 何钦铭 单位 浙江大学 For an AVL-tree of height 4, what is the minimum number of the tree nodes? (the height of one node tree is 0) A. 11 B. 12 C. 14 D. 15 分数 2 作者 何钦铭 单位 浙江大学 During inserting { 42, 26, 8, 70, 102, 56, 2} into an initially empty AVL tree, which of the following statements is true? A. The resulted AVL tree is also a completed binary tree; B. There are 4 rotations: LL,RR,LR,LL C. There are 4 rotations: LL,RR,LL,RL D. There are 3 rotations: LL,RR,RL 分数 2 作者 何钦铭 单位 浙江大学 When inserting 1, 2, 3, 6, 5, and 4 one by one into an initially empty AVL tree,which kinds of rotations will be encountered? A. Two RR's and one RL B. One RR, one RL, and one LR C. One RR and two RL's D. Two RR's and one LR 分数 2 作者 陈越 单位 浙江大学 将 26, 13, 44, 51, 98, 37, 66, 73 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的? A. 44 是根结点 B. 37 和 73 是兄弟 C. 26 和 66 是兄弟 D. 26 是 13 的父结点 分数 2 作者 何钦铭 单位 浙江大学 将一系列数字顺序一个个插入一棵初始为空的AVL树。下面哪个系列的第一次旋转是“右-左”双旋? A. 1,2,3,4,5,6 B. 6,5,4,3,2,1 C. 4,2,5,6,3,1 D. 3,1,4,6,5,2 分数 2 作者 考研真题 单位 浙江大学 Delete a node v from an AVL tree T1​, we can obtain another AVL tree T2​. Then insert v into T2​, we can obtain another AVL tree T3​. Which one(s) of the following statements about T1​ and T3​ is(are) true? I、If v is a leaf node in T1​, then T1​ and T3​ might be different. II、If v is not a leaf node in T1​, then T1​ and T3​ must be different. III、If v is not a leaf node in T1​, then T1​ and T3​ must be the same. A. I only B. II only C. I and II only D. I and III only 分数 2 作者 何钦铭 单位 浙江大学 Insert 28, 23, 54, 61, 98, 37 into an initially empty AVL tree first. Then immediately insert one of the following keys. Which one will cause an RL rotation? A. 10 B. 30 C. 60 D. 70 分数 2 作者 何钦铭 单位 浙江大学 Insert 28, 23, 54, 61, 98, 37 into an initially empty AVL tree first. Then immediately insert one of the following keys. Which one will cause an RL rotation? A. 10 B. 50 C. 80 D. 100 分数 3 作者 陈越 单位 浙江大学 If there are 14 nodes in an AVL tree, then the maximum depth of the tree is ____. The depth of an empty tree is defined to be 0. A. 3 B. 4 C. 5 D. 6 分数 3 作者 陈越 单位 浙江大学 If there are 28 nodes in an AVL tree, then the maximum depth of the tree is ____. The depth of an empty tree is defined to be -1. A. 3 B. 4 C. 5 D. 6 分数 3 作者 DS课程组 单位 浙江大学 If the depth of an AVL tree is 6 (the depth of an empty tree is defined to be -1), then the minimum possible number of nodes in this tree is: A. 13 B. 17 C. 20 D. 33 分数 2 作者 101 数据结构团队 单位 101计划 给定关键词输入序列 { CAP, AQU, PIS, ARI, TAU, GEM, CAN, LTB, VIR, LEO, SCO },,试按表中元素的次序,依次插入一棵初始为空的 AVL 树(字符之间以字典顺序比较大小)。则关于最后产生的 AVL 树,哪句描述是错误的? A. 在形成结果树的过程中,涉及 2 次旋转调整 B. LTB 是 GEM 的父结点 C. PIS 是 TAU 的父结点 D. CAP 是根结点
10-11
以下是针对不同类型AVL树相关选择题的解答分析: ### 插入特定数字序列到AVL树后的节点关系判断 插入操作和二分搜索树类似,但需多考虑节点的平衡问题。若一串数字插入顺序为3,4,5,树结构会退化为链表,此时AVL树会进行旋转操作以达到平衡,旋转操作会在增加、删除、修改时进行,旋转分为LL型、LR型、RR型和RL型四种情况 [^2][^3]。判断节点关系时,要先根据插入顺序构建AVL树,插入过程中若不满足平衡条件(每个结点左右子树高度之差的绝对值不超过1),就需进行相应旋转操作,最终根据旋转后的树结构判断节点关系。 ### AVL树特定深度下的最少节点数计算 设AVL树深度为 $d$,最少节点数为 $N(d)$。深度为0时,$N(0) = 0$;深度为1时,$N(1) = 1$。对于 $d > 1$,$N(d) = N(d - 1) + N(d - 2) + 1$,这是因为AVL树要达到最少节点数,其左右子树高度差为1,左右子树分别是深度为 $d - 1$ 和 $d - 2$ 的AVL树,再加上根节点。例如,求深度为3的AVL树最少节点数,$N(2)=N(1)+N(0)+1 = 1 + 0 + 1 = 2$,$N(3)=N(2)+N(1)+1 = 2 + 1 + 1 = 4$。 ### 插入节点导致的旋转类型判断 失衡条件分为LL型、LR型、RR型和RL型四种,针对不同类型的失衡有不同的旋转策略 [^3]。 - **LL型**:在节点的左子树的左子树上插入新节点,导致树失衡,需进行右旋操作。 - **LR型**:在节点的左子树的右子树上插入新节点,导致树失衡,需先对左子树进行左旋,再对根节点进行右旋。 - **RR型**:在节点的右子树的右子树上插入新节点,导致树失衡,需进行左旋操作。 - **RL型**:在节点的右子树的左子树上插入新节点,导致树失衡,需先对右子树进行右旋,再对根节点进行左旋。 ### 代码示例 ```python # 定义AVL树节点类 class TreeNode: def __init__(self, key): self.key = key self.left = None self.right = None self.height = 1 # 定义AVL树类 class AVLTree: def insert(self, root, key): if not root: return TreeNode(key) elif key < root.key: root.left = self.insert(root.left, key) else: root.right = self.insert(root.right, key) root.height = 1 + max(self.get_height(root.left), self.get_height(root.right)) balance = self.get_balance(root) # LL型 if balance > 1 and key < root.left.key: return self.right_rotate(root) # RR型 if balance < -1 and key > root.right.key: return self.left_rotate(root) # LR型 if balance > 1 and key > root.left.key: root.left = self.left_rotate(root.left) return self.right_rotate(root) # RL型 if balance < -1 and key < root.right.key: root.right = self.right_rotate(root.right) return self.left_rotate(root) return root def left_rotate(self, z): y = z.right T2 = y.left y.left = z z.right = T2 z.height = 1 + max(self.get_height(z.left), self.get_height(z.right)) y.height = 1 + max(self.get_height(y.left), self.get_height(y.right)) return y def right_rotate(self, z): y = z.left T3 = y.right y.right = z z.left = T3 z.height = 1 + max(self.get_height(z.left), self.get_height(z.right)) y.height = 1 + max(self.get_height(y.left), self.get_height(y.right)) return y def get_height(self, root): if not root: return 0 return root.height def get_balance(self, root): if not root: return 0 return self.get_height(root.left) - self.get_height(root.right) # 示例使用 avl = AVLTree() root = None keys = [3, 4, 5] for key in keys: root = avl.insert(root, key) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值