leetcode刷题13

孤街浪徒 提交于 2019-11-28 01:28:00

j今天刷的题是LeetCode第235题。题目要求是:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先

 即,对于有根树T的两个节点pq,最近公共祖先表示为一个节点x,满足pq是x的子节点且x的深度尽可能大

其中给定的二叉树,所有节点的值均不相同,并且pq为不同节点且在二叉树中

开始的时候,想通过暴力法求解:即找到pq的节点的所有祖先节点,然后找出公共的节点即可。但是这在遍历搜索的时候出了问题,暂时还没解决

然后是参考LeetCode的官方解答思路:因为二叉搜索树有一个特点,那就是左子树的节点值都比右子树节点值小

pq的存在一共有三种情况:①pq在节点的左右子树中,此时pq的值将根节点的值夹在中间;②pq在左子树中,此时,pq的值均小于根节点的值;③pq的值在右子树中,此时pq的值均大于根节点的值

具体地代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
         // Value of current node or parent node.
        int parentVal = root.val;

        // Value of p
        int pVal = p.val;

        // Value of q;
        int qVal = q.val;

        if (pVal > parentVal && qVal > parentVal) {
            // If both p and q are greater than parent
            return lowestCommonAncestor(root.right, p, q);
        } else if (pVal < parentVal && qVal < parentVal) {
            // If both p and q are lesser than parent
            return lowestCommonAncestor(root.left, p, q);
        } else {
            // We have found the split point, i.e. the LCA node.
            return root;
        }
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!