1. 程式人生 > >235. 二叉搜尋樹的最近公共祖先(leetcode/C++)

235. 二叉搜尋樹的最近公共祖先(leetcode/C++)

給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。

百度百科中最近公共祖先的定義為: “對於有根樹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;
    }
};