JAVA学习-练习试用Java实现“二叉搜索树的最近公共祖先”

问题:

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树: 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, 因为根据定义最近公共祖先节点可以为节点本身。

说明:

所有节点的值都是唯一的。

p、q 为不同节点且均存在于给定的二叉搜索树中。

 

解答思路:

以下是使用 Java 实现的二叉搜索树的最近公共祖先的代码:

```java

class TreeNode {

    int val;

    TreeNode left;

    TreeNode right;

    TreeNode(int x) { val = x; }

}

 

public class LowestCommonAncestorOfABST {

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {

        // 如果根节点为空或等于 p 或 q,返回根节点

        if (root == null || root == p || root == q) {

            return root;

        }

 

        // 如果 p 和 q 的值都小于根节点的值,在左子树中继续查找

        if (p.val < root.val && q.val < root.val) {

            return lowestCommonAncestor(root.left, p, q);

        }

        // 如果 p 和 q 的值都大于根节点的值,在右子树中继续查找

        else if (p.val > root.val && q.val > root.val) {

            return lowestCommonAncestor(root.right, p, q);

        }

        // 否则,p 和 q 在根节点的两侧,返回根节点作为最近公共祖先

        else {

            return root;

        }

    }

 

    public static void main(String[] args) {

        // 创建二叉搜索树

        TreeNode root = new TreeNode(6);

        root.left = new TreeNode(2);

        root.right = new TreeNode(8);

        root.left.left = new TreeNode(0);

        root.left.right = new TreeNode(4);

        root.left.right.left = new TreeNode(3);

        root.left.right.right = new TreeNode(5);

        root.right.left = new TreeNode(7);

        root.right.right = new TreeNode(9);

 

        // 定义要查找最近公共祖先的节点 p 和 q

        TreeNode p = root.left; 

        TreeNode q = root.right; 

 

        // 创建 LowestCommonAncestorOfABST 对象并调用 lowestCommonAncestor 方法

        LowestCommonAncestorOfABST lca = new LowestCommonAncestorOfABST();

        TreeNode ancestor = lca.lowestCommonAncestor(root, p, q);

 

        // 输出最近公共祖先节点的值

        System.out.println("最近公共祖先节点的值: " + ancestor.val);

    }

}

```

在这个代码中,我们首先定义了一个 'TreeNode' 类来表示二叉树的节点。然后,'lowestCommonAncestor' 方法接受根节点、要查找最近公共祖先的节点 'p' 和 'q' 作为参数。

根据二叉搜索树的性质,我们可以通过比较节点 'p' 和 'q' 的值与根节点的值来确定它们在树中的位置。如果 'p' 和 'q' 的值都小于根节点的值,那么它们都在左子树中,我们在左子树中继续查找;如果 'p' 和 'q' 的值都大于根节点的值,那么它们都在右子树中,我们在右子树中继续查找;否则,'p' 和 'q' 在根节点的两侧,根节点就是它们的最近公共祖先。

在 'main' 方法中,我们创建了一个二叉搜索树,并定义了节点 'p' 和 'q' 。然后,我们创建 'LowestCommonAncestorOfABST' 对象并调用 'lowestCommonAncestor' 方法来查找它们的最近公共祖先。最后,我们输出最近公共祖先节点的值。

(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值