leetcode 235.二叉搜索树的最近公共祖先

235.二叉搜索树的最近公共祖先

题目描述

leetcode 235.二叉搜索树的最近公共祖先_第1张图片

解题思路

二叉搜索树的公共祖先
方法一:我们可以先找到根结点到两个结点的路径,然后进行保存,找到保存的路径中,最后一个相同的元素,这个元素就是我们所需要的最近的公共祖先。
方法二:我们需要发现二叉搜索树的一个特点,就是倘若根节点到两个结点之间有重合的路径,那么这两个结点,一定会共同小于或者大于此路径上的某些节点。这就给我们提供了方法二。我们从根结点开始向下遍历,选择下一个遍历结点的条件是,所访问的两个结点同时大于或者同时小于根结点,才能做到有公共的路径。如果没有同时大于或者同时小于结点的值,那么就说明,此结点就是最近的分叉点。

实现代码

/**
 * 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 *> v1,v2;  //两个数组用来保存路径
        TreeNode * node = root;
        while(node != p)
        {
            v1.push_back(node);
            if(node->val < p->val)
            {
                node = node->right;
            }
            else
            {
                node = node->left;
            }
        }
        v1.push_back(node);     //将找到的结点也加入数组中
        node = root;
        while(node != q)
        {
            v2.push_back(node);
            if(node->val < q->val)
            {
                node = node->right;
            }
            else
            {
                node = node->left;
            }
        }
        v2.push_back(node);
        int i;
        for(i = 0 ; i < v1.size() && i < v2.size() ;++i)
        { 
            if(v1[i] != v2[i])
            {
                break;
            }
        }
        return v1[i-1];
    }

        TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
    {
        //创建一个结点,用来保存上一个结点
        TreeNode * prenode = root;
        while(true)
        {
            if(root->val > p->val && root->val > q->val)
            {
                root = root->left;
            }
            else if(root->val < p->val && root->val < q->val)
            {
                root = root->right;
            }
            else
            {
                break;
            }
        }
        return root;
    }
};

你可能感兴趣的:(leetcode,c++,leetcode,算法,数据结构)