二叉樹題目----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.pswp.cn/news/383157.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383157.shtml
英文地址,請注明出處:http://en.pswp.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…