二叉树题目----6 二叉树的最近公共祖先 AND 二叉树搜索树转换成排序双向链表

二叉树的最近公共祖先

在这里插入图片描述
在这里插入图片描述

思路

  1. 在左、右子树中分别查找是否包含p或q:
  2. 如果以下两种情况(左子树包含p,右子树包含q/左子树包含q,右子树包含p),那么此时的根节点就是最近公共祖先
  3. 如果左子树包含p和q,那么到root->left中继续查找,最近公共祖先在左子树里面
  4. 如果右子树包含p和q,那么到root->right中继续查找,最近公共祖先在右子树里面
 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root == nullptr || root == p || root == q){return root;}TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);return left == nullptr ? right : (right == nullptr ? left : root);}
};

二叉树搜索树转换成排序双向链表

在这里插入图片描述
二叉搜索树:普通的二叉树

  1. 左子树所有结点小于根
  2. 右子树所有结点大于根
  3. 中序有序
Node *prev = NULL;
void func(Node *node){node->left = prev;	//等于上面的node->prev;if(prev != NULL){prev->right = node ; //等于上面的prev->next}prev = node;
}void inorder(Node *root){if(root == NULL)return ;inorder(root->left);func(root);inorder(root->right);
}
class Solution {
public:TreeNode *prev = NULL;TreeNode *first ;void fun(TreeNode * node){node->left =prev;if(prev!=NULL){prev->right = node;}else{first = node;}prev =node;}void Inorder(TreeNode *root){if(root == NULL){return ;}Inorder(root->left);fun(root);Inorder(root->right);}TreeNode* Convert(TreeNode* pRootOfTree){first = NULL;Inorder(pRootOfTree);return first;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树题目 ----7 前序中序遍历构造二叉树

前序中序遍历构造二叉树 思路 在前序中找根结点根据根结点 中序,分成左右两棵子树根据子树长度,把前序分成左右两颗子树递归处理子树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* s…

关联式容器(map,set,multimap,multiset)

关联式概念 STL中的部分容器,比如:vector、list、deque、forward_list(C11)等,这 些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式…

详解 二叉搜索树-----AVL树

二叉搜索树 根结点比左子树中所有结点都大根结点比右子树所有结点都小最小的元素在最左侧最大的元素在最右侧中序遍历有序 具有以上的特征的二叉树就是二叉搜索树也叫二叉排序数 二叉搜索树的操作 查找 要保存查找值的双亲,以便于后续执行插入操作 Node* Find(…

json格式与cJSON函数库

json的格式 键/值对 key:value,用半角冒号分割文档对象 JSON对象写在花括号中,可以包含多个键/值对。数组 JSON 数组在方括号中书写: 数组成员可以是对象,值,也可以是数组(只要有意义)。 { "stars":[ { &qu…

HTTP清晰的学习笔记

HTTP协议—应用层 请求消息(Request)—浏览器给服务器发 包含四部分 请求行:说明请求类型,要访问的资源,以及使用的http版本请求头:说明服务器要使用的附加信息,由键值对构成的空行:空行是必须要有的,即…

如何在 Centos7 x86_64下将vim一键配置为一款强大的C++,IDE

vim功能很强大,但是对于我这样的小白很不友好 然后就有一位大佬,为了辅助我这样的菜鸡,然后供我们一键搞定,在vim畅快编写代码的功能。 首先强烈不推荐在root用户下使用,确保电脑连着网。在普通用户下执行此命令 cur…

听说今天发表文章给勋章

听说今天发表文章给勋章

详解string容器(应用+模拟实现,string练习题)

为什么要有string容器 string:其实就是一个字符串,c对字符串进行了封装的,封装到一个类里面,这样用户就不用担心开辟空间的问题,只需要往string类里放字符串就可以了,string其实还可以自增长 很多人就会有一个疑问&am…

浅拷贝+引用计数--写时拷贝---模拟实现string容器

引用计数 深拷贝 多个对象共享同一份资源时,最后能够保证该资源只被释放一次 应该由哪个对象释放资源? 由最后一个使用该资源的对象去释放 怎么知道一个对象是最后一个使用该资源的对象? 给一个计数,记录使用该资源对象的个数 实…

详解vector容器(应用+模拟实现,vector相关练习题)

vector容器 动态的顺序表&#xff0c;数组。 vector操作 vector操作及其概念 构造 vector<int>v1;vector<int>v2(10, 5);vector<int>v3(v2);int array[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };vector<int>v4(array, array sizeof(array) / sizeof(a…

详解list容器(应用+模拟实现)

list容器 带头结点的双向循环链表 list操作 list容器的概念及其操作 构造和销毁 list<int>L1;list<int>L2(10, 5);vector<int>v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };list<int>L3(v.begin(), v.end());list<int>L4(L3);元素访问 cout << L3.…

vector和list容器有哪些区别

这个问题的本质还是在问顺序表和链表的区别 底层结构不同 vector容器list容器一段连续的空间带头结点的双向循环链表 元素访问方式 vector容器list容器支持随机访问—O(1)不支持随机访问—O(N)需要扩容不需要扩容任意位置插入元素----O(N)–搬移元素O(1) 迭代器不同 vector…

复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值

栈和队列的概念 栈:吃进去吐出来 对列&#xff1a;吃进去拉出来 数据结构中的栈和内存中的区别 数据结构中的栈具有后进先出的特性&#xff0c;而内存中的栈是一个内存空间&#xff0c;只不过这个内存空间具与数据结构的栈具有相同的特性。 栈和队列操作 栈和队列基本操作…

CentOS7关闭防火墙

firewalld的基本使用 启动 systemctl start firewalld关闭 systemctl stop firewalld查看状态 systemctl status firewalld 开机禁用 systemctl disable firewalld开机启用 systemctl enable firewalldCentOS 7的服务管理 启动一个服务 systemctl start firewalld.service关闭…

详解优先级队列priority_queue(应用+模拟实现)

优先级队列的概念 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的此上下文类似于堆&#xff0c;在堆中可以随时插入元素&#xff0c;并且只能检索最大堆元素(优先队列中位于顶部的元 素)。优先队列被实现为容…

c++中容器适配器

什么是容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff0c;该中模式是将一个类的接口转换成客户希望的另外一个接口。 stack模拟封装 template<class T,class Container deque<T>>cl…

模拟实现priority_queue优先级队列

优先级队列 无参构造 priority_queue():c(){}区间构造 区间构造需要用到迭代器&#xff0c;而迭代器每个容器的类型不一样&#xff0c;所以用模板给出&#xff0c;初始化列表&#xff0c;把用户给进来的元素空间起始位置&#xff0c;放到优先级队列中底层空间的位置&#xf…

详解malloc,calloc,realloc原理及其模拟实现

malloc原理 malloc它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时&#xff0c;它沿连接表寻找一个大到足以满足 用户请求所需要的内存块。然后&#xff0c;将该内存块一分为二&#xff08;一块的大小与用户请求的大小相等&#xff0c;另一块的大…

c++动态内存管理题目

malloc/free和new/delete的区别 malloc/free和new/delete的共同点是&#xff1a;都是从堆上申请空间&#xff0c;并且需要用户手动释放。不同的地方是&#xff1a; malloc和free是函数&#xff0c;new和delete是操作符malloc申请的空间不会初始化&#xff0c;new可以初始化ma…

私人博客定制----封装数据库接口

封装MySQLAPI 我们先把初始化句柄和断开句柄进行一个封装 static MYSQL* MySQLInit(){ //1.初始化一个Mysql句柄建立连接 MYSQL* connect_fd mysql_init(NULL); //2.和数据库建立连接 if (mysql_real_connect(connect_fd, "127.0.0.1", "root&quo…