235. 二叉搜尋樹的最近公共祖先
給定乙個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。參考:**隨想錄例如,給定如下二叉搜尋樹: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
輸出: 6
解釋: 節點 2 和節點 8 的最近公共祖先是 6。
示例 2:
輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
輸出: 2
解釋: 節點 2 和節點 4 的最近公共祖先是 2, 因為根據定義最近公共祖先節點可以為節點本身。
首先搞清楚二叉搜尋樹跟普通二叉樹的區別,即二叉搜尋樹是有序的。求最小公共祖先,就是給定乙個根節點root,然後看它的左右子樹(或它本身)中是否存在p或q節點,這樣理解會比從底往上找最小公共祖先好一些。
1.那麼普通二叉樹的話因為節點值的無序性,所以需要遍歷整棵樹,遍歷整棵樹的話就需要分別遍歷左子樹、右子樹,然後將兩者進行邏輯判斷,如下:
2.然後二叉搜尋樹的話因為節點值的有序性,不需要遍歷整顆樹,只需判斷當前節點值跟p,q節點值大小即可。比如,節點值大於p,q節點值,說明該往root左邊去找,讓左邊去遞迴。節點值小於p,q節點值,說明該往root右邊去找,讓右邊遞迴。其他情況,比如p在root左邊,q在root右邊,那麼root就是p,q最小公共祖先。不用遍歷整棵樹邏輯一般如下left = 遞迴左子樹
right = 遞迴右子樹
return 邏輯判斷(left、right)
if(root->left) 遞迴左子樹 return
if(root->right) 遞迴右子樹 return
```cpp
/**求一般二叉樹的最小公共祖先
* definition for a binary tree node.
* struct treenode
* };
*/class solution
};```
```cpp
/**bst最小公共祖先
* definition for a binary tree node.
* struct treenode
* };
*/class solution
//當p,q節點的值都大於當前節點root的值時,就應該往右邊去尋找
else if(root->val < p->val && root->val < q->val)
//其他情況說明,root左邊右邊有q或p,說明root即為公共祖先
return root;
}};```
```cpp
/**迭代法
* definition for a binary tree node.
* struct treenode
* };
*/class solution
return nullptr;
}};```
Leetcode 235 二叉搜尋樹的公共祖先
給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。中最近公共祖先的定義為 對於有根樹 t 的兩個結點 p q,最近公共祖先表示為乙個結點 x,滿足 x 是 p q 的祖先且 x 的深度盡可能大 乙個節點也可以是它自己的祖先 例如,給定如下二叉搜尋樹 root 6,2,8,0,4,7,9,nu...
(樹 18)求二叉搜尋樹最小絕對差
530.二叉搜尋樹的最小絕對差 參考 隨想錄 跟 98.判斷是否為bst 二叉樹遍歷方法 驗證二叉搜尋樹 類似的解法 注意的點 只要是bst,中序都可以看成是乙個有序遞增的陣列。int max是整數型別最大值,int min是整數型別最小值,有注釋為何要使用最大值 cpp bst套路 遞迴加進vec...
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...