樹 20 求二叉(搜尋)樹的最小公共祖先

2021-10-24 23:28:35 字數 1854 閱讀 6442

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.那麼普通二叉樹的話因為節點值的無序性,所以需要遍歷整棵樹,遍歷整棵樹的話就需要分別遍歷左子樹、右子樹,然後將兩者進行邏輯判斷,如下:

left = 遞迴左子樹

right = 遞迴右子樹

return 邏輯判斷(left、right)

2.然後二叉搜尋樹的話因為節點值的有序性,不需要遍歷整顆樹,只需判斷當前節點值跟p,q節點值大小即可。比如,節點值大於p,q節點值,說明該往root左邊去找,讓左邊去遞迴。節點值小於p,q節點值,說明該往root右邊去找,讓右邊遞迴。其他情況,比如p在root左邊,q在root右邊,那麼root就是p,q最小公共祖先。不用遍歷整棵樹邏輯一般如下

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...