day 22 第六章 二叉树part07

embedded/2024/10/19 22:17:44/
  1. 二叉搜索树的最近公共祖先

利用二叉搜索树的特性。

题目链接/文章讲解:代码随想录

递归法

class Solution {
private:TreeNode* traversal(TreeNode* cur, TreeNode* p, TreeNode* q) {if (cur == NULL) return cur;// 中if (cur->val > p->val && cur->val > q->val) {   // 左TreeNode* left = traversal(cur->left, p, q);if (left != NULL) {return left;}}if (cur->val < p->val && cur->val < q->val) {   // 右TreeNode* right = traversal(cur->right, p, q);if (right != NULL) {return right;}}return cur;}
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {return traversal(root, p, q);}
};

701.二叉搜索树中的插入操作

不需要改结构,只需要在叶子节点找到对应的位置即可

代码随想录

递归法

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if (root == NULL) {TreeNode* node = new TreeNode(val);return node;}if (root->val > val) root->left = insertIntoBST(root->left, val);if (root->val < val) root->right = insertIntoBST(root->right, val);return root;}
};

迭代法

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if (root == NULL) {TreeNode* node = new TreeNode(val);return node;}TreeNode* cur = root;TreeNode* parent = root; // 这个很重要,需要记录上一个节点,否则无法赋值新节点while (cur != NULL) {parent = cur;if (cur->val > val) cur = cur->left;else cur = cur->right;}TreeNode* node = new TreeNode(val);if (val < parent->val) parent->left = node;// 此时是用parent节点的进行赋值else parent->right = node;return root;}
};

450.删除二叉搜索树中的节点

1、没有找到要删除的节点
2、要删除的节点是叶子节点
3、要删除的节点左不为空,右为空(该节点的父节点直接指向左孩子)
4、要删除的节点左为空,右不空(该节点的父节点直接指向右孩子)
5、要删除的节点左不为空,右不为空(该节点由左孩子继承或者右孩子继承都可以,例如让右孩子继承,那就要找右孩子的位于最左边的孩子)

代码随想录

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if (root == nullptr) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了if (root->val == key) {// 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点if (root->left == nullptr && root->right == nullptr) {///! 内存释放delete root;return nullptr;}// 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点else if (root->left == nullptr) {auto retNode = root->right;///! 内存释放delete root;return retNode;}// 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点else if (root->right == nullptr) {auto retNode = root->left;///! 内存释放delete root;return retNode;}// 第五种情况:左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置// 并返回删除节点右孩子为新的根节点。else {TreeNode* cur = root->right; // 找右子树最左面的节点while(cur->left != nullptr) {cur = cur->left;}cur->left = root->left; // 把要删除的节点(root)左子树放在cur的左孩子的位置TreeNode* tmp = root;   // 把root节点保存一下,下面来删除root = root->right;     // 返回旧root的右孩子作为新rootdelete tmp;             // 释放节点内存(这里不写也可以,但C++最好手动释放一下吧)return root;}}if (root->val > key) root->left = deleteNode(root->left, key);if (root->val < key) root->right = deleteNode(root->right, key);return root;}
};

http://www.ppmy.cn/embedded/128836.html

相关文章

VBA技术资料MF211:重置右键菜单及子菜单

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

2024全国大数据与计算智能挑战赛火热报名中!

一年一度的 全国大数据与计算智能挑战赛震撼来袭&#xff01; 报名速通&#xff1a; https://www.datafountain.cn/special/BDSSF2024 大数据与决策&#xff08;国家级&#xff09;实验室连续三年组织发起全国大数据与计算智能挑战赛&#xff0c;旨在深入挖掘大数据应用实践中亟…

Java基础系列和实战

概述 最近对自己的Java基础知识做了以下全面的总结&#xff0c;把知识总结成了Java的基础知识系列&#xff0c;每个知识点总结都结合了实战代码。把这些基础知识放到了java的专栏里&#xff08;专栏还会持续更新Java进阶的一些知识&#xff0c;如并发编程、Java网络编程、反射…

基于PHP+MySQL+Vue的医院预约挂号管理系统

摘要 本文介绍了一个基于PHP、MySQL和Vue技术栈的医院预约挂号管理系统。该系统旨在优化患者就医流程&#xff0c;提高医院服务效率。后端采用PHP语言开发&#xff0c;利用MySQL数据库存储患者信息、医生排班、科室设置等核心数据&#xff0c;确保了数据的安全性和稳定性。前端…

10月18日,每日信息差

第一、现代汽车集团在上海举办了中国前瞻技术研发中心的发布及启新庆典&#xff0c;宣布成立其全资法人公司 —— 现代前瞻汽车技术开发&#xff08;上海&#xff09;有限公司。该中心是集团在海外建立的首个前瞻技术研发中心&#xff0c;专注于自动驾驶、智能座舱、共享出行等…

2_A Guide for EtherNetIP™ Developers之从0开发EtherNetIP

1、该手册的目的 如果您正打算实现 EtherNet/IP™。您从哪里开始&#xff1f;您有哪些选择&#xff1f;您应该考虑哪些问题&#xff1f;您需要了解协议的哪些信息&#xff1f;您应该如何进行开发&#xff1f; 本指南对上述问题给出了基本答案。它概述了实施以太网/IP 所需的步骤…

VuePress的基本常识

今天大概了解了一下Vuepress&#xff0c;感觉很棒&#xff0c;看着极其简单&#xff0c;自己也想做一个&#xff0c;后续我大概率也会做一个用Vuepress为基础做的博客网站&#xff0c;很酷~ 哈哈哈&#xff0c;下面是我今天学习Vuepress的一些内容&#xff0c;简单分享下&#…

JVM - 类加载器ClassLoader

一、简介 在Java中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是一个关键的组件&#xff0c;它负责将字节码文件加载到内存并转换成Java类。Java的类加载器主要可以分成两类&#xff1a;系统提供的和由Java应用开发人员编写的。Java开发者可以根据需要创建自己的…