235. 二叉搜尋樹的最近公共祖先(leetcode/C++)
阿新 • • 發佈:2019-02-12
給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。
百度百科中最近公共祖先的定義為: “對於有根樹T的兩個結點u、v,最近公共祖先表示一個結點x,滿足x是u、v的祖先且x的深度儘可能大。”(一個節點也可以是它自己的祖先)
例如,給定二叉搜尋樹: root = [6,2,8,0,4,7,9,null,null,3,5]
_______6______ / \ ___2__ ___8__ / \ / \ 0 _4 7 9 / \ 3 5
示例 1:
輸入: root, p = 2, q = 8 輸出: 6 解釋: 節點2
和節點8
的最近公共祖先是6。
示例 2:
輸入: root, p = 2, q = 4 輸出: 2 解釋: 節點2
和節點4
的最近公共祖先是2
, 因為根據定義最近公共祖先節點可以為指定節點自身。
思想:由於是基於二叉樹搜尋樹進行查詢,那麼問題簡化了很多。這裡我用到了兩個vector分別記錄了兩個結點的搜尋路徑,然後再遍歷兩個vector找出最後一個相同的結點,這裡需要注意的是題目要求返回結點指標,那麼在定義vector儲存變數型別的時候需要注意了。細節見程式碼:
/** * Definition for a binary tree node. * 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) { vector<TreeNode*> left; vector<TreeNode*> right; TreeNode *pp = root; TreeNode *qq = root; while (pp != NULL) { left.push_back(pp); if (p->val < pp->val) { pp = pp->left; } else if (p->val > pp->val) { pp = pp->right; } else { break; } } while (qq != NULL) { right.push_back(qq); if (q->val < qq->val) { qq = qq->left; } else if (q->val > qq->val) { qq = qq->right; } else { break; } } int i = 0; int j = 0; TreeNode *temp; while (i < left.size() && j < right.size()) { if (left[i] == right[j]) { temp = left[i]; } i++; j++; } return temp; } };