求解二叉查找树中的最低公共祖先结点

一,问题描述

请构造一棵二叉查找树,并给定两个结点,请找出这两个结点的最低公共祖先结点。

这里假设二叉查找树中的结点的权值存储是整型数字(见代码中的BinaryNode内部类),最低公共祖先结点如下:结点5 和 结点12 的最低公共祖先结点是结点10

二,实现思路

假设给定的两个结点的权值分别为 node1 和 node2

如果根的权值处于 node1 和 node2 之间,则根就是它们的最低公共祖先结点

如果根的权值比 node1 和 node2 都大,则它们的最低公共祖先结点在根的左子树中

如果根的权值比 node1 和 node2 都小,则它们的最低公共祖先结点在根的右子树中

因此,这可以用递归来实现。

三,代码实现

首先得构造一棵二叉查找树。具体构造可参考:二叉树的构造

构造好之后,调用lowestCommonParentNode方法即可找出最低公共祖先结点的权值。

public class LowCommonNode {

    private class BinaryNode{
        BinaryNode left;
        BinaryNode right;
        int ele;

        public BinaryNode(int ele) {
            this.ele = ele;
            left = right = null;
        }
    }

    private BinaryNode root;

    private void buildTree(int[] arr){
        for (int i : arr) {
            insert(i);
        }
    }
    private void insert(int ele){
        root = insert(root, ele);
    }
    private BinaryNode insert(BinaryNode root, int ele){
        if(root == null)
            return new BinaryNode(ele);

        if(root.ele > ele)//insert left
            root.left = insert(root.left, ele);
        else if(root.ele < ele)
            root.right = insert(root.right, ele);
        else
            root.left = insert(root.left, ele);//相等时,放在左边
        return root;
    }

    /**
     * 求解二叉查找树中  node1 和 node2 代表的节点的 最低公共祖先结点
     * 首先让node1总是代表权值较小的那个结点.
     * 对于二叉查找树而言:
     * 如果根的权值处于 node1 和 node2 之间,则根就是它们的最低公共祖先结点
     * 如果根的权值比 node1 和 node2 都大,则它们的最低公共祖先结点在根的左子树中
     * 如果根的权值比 node1 和 node2 都小,则它们的最低公共祖先结点在根的右子树中
     */
    public int lowestCommonParentNode(BinaryNode root, int node1, int node2)
    {
        if(node1 > node2)
        {
            int tmp = node1;
            node1 = node2;
            node2 = tmp;
        }
        assert node1 < node2;

        if(root == null)
            throw new IllegalArgumentException(" neither node1 nor node2 contains in binary search tree ");

        if(root.ele > node1 && root.ele < node2)
            return root.ele;

        if(root.ele > node1 && root.ele > node2)//if(root.ele > node2)
            //在左子树中查找最低公共祖先结点
            return lowestCommonParentNode(root.left, node1, node2);
        else//root.ele < node1
            //在右子树中查找最低公共祖先结点
            return lowestCommonParentNode(root.right, node1, node2);
    }

    //hapjin test
    public static void main(String[] args) {
        LowCommonNode lcn = new LowCommonNode();
        int[] arr = {20,10,30,5,15,25,40,12,18};
        lcn.buildTree(arr);//build a binary search tree

        // node1 and node2 should exist in arr,or will throw IllegalArgumentException
        int node1 = 5;
        int node2 = 12;

        //should build Tree before invoke lowestCommonParentNode
        System.out.println(lcn.lowestCommonParentNode(lcn.root, node1, node2));
    }
}

四,参考资料

求解二叉树中两个结点的最低公共父结点

二叉树的构造

时间: 2024-12-03 04:18:51

求解二叉查找树中的最低公共祖先结点的相关文章

寻找二叉树中的最低公共祖先结点----LCA(Lowest Common Ancestor )问题(递归)

转自 剑指Offer之 - 树中两个结点的最低公共祖先 题目: 求树中两个节点的最低公共祖先. 思路一: --如果是二叉树,而且是二叉搜索树,那么是可以找到公共节点的. 二叉搜索树都是排序过的,位于左子树的节点都比父节点小,而位于右子树上面的节点都比父节点大. 如果当前节点的值比两个结点 的值都大,那么最低的共同的父节点一定是在当前节点的左子树中,于是下一步遍历当前节点的左子节点. 如果当前节点的值比两个结点的值都小,那么最低的共同的父节点一定是在当前节点的右子树中,于是下一步遍历当前节点的右子

求解二叉树中两个结点的最低公共父结点

一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中某两个结点的最低公共父结点.借用一张图如下: 结点8 和 结点5 的最低公共父结点为 结点2 二,二叉树的构建 与 求二叉树中第K层结点的个数 文章中的第二点:二叉树构建相同 三,求解最低公共父结点的算法实现 有两种思路,一种是通过中序遍历和后序遍历.由于中序遍历是先左子树中的结点,再访问根,再访问右子树中结点,因此这两个结点的公共父结点一定处于这两个结点之间. 如:中序遍历:8, 4, 9, 2, 5, 1, 6, 3, 7  

树中两个结点的最低公共祖先

情况1: 树为二叉排序树. 思路:从根结点开始和输入的两个结点进行比较,如果当前结点的值比两个结点的值都大,那么最低的祖先肯定在左子树中,于是下一步遍历当前结点的左子结点.如果当前结点的值比两个结点的值都小,那么最低的祖先肯定在右子树种,于是下一步遍历当前结点的右子结点.如果当前结点正好是输入的两个结点之一,说明这两个结点有一个是另一个的祖先,这时输出当前结点的父节点即可. /* 二叉树的公共祖先系列 1.二叉树为二叉排序树 by Rowandjj 2014/8/20 */ #include<i

二叉树中找两个结点的最近的公共祖先结点

#pragma once #include <iostream> using namespace std; /****************  * 二叉树中 找两个结点的最近的公共祖先结点 ******************/ struct Node {     Node* left;     Node* right;     int value;     Node(int v)         :value(v)         ,left(NULL)         ,right(NU

求一棵普通树的两个结点的最低公共祖先

一棵普通树,树中的结点没有指向父节点的指针,求一棵普通树的两个结点的最低公共祖先. 代码如下,我太懒没有加注释,大家自己看吧! 1 #include <iostream> 2 #include <list> 3 #include <vector> 4 using namespace std; 5 6 struct TreeNode //节点 7 { 8 char m_nValue; 9 vector<TreeNode*> m_vChildren; 10 };

二叉树中寻找共同节点的最低公共祖先节点

问题:在一棵二叉树中,给定两个节点,求这两个节点的最低的公共祖先节点,如下图中的,节点 6 和 节点 9 的最低公共祖先节点是节点 5. 最容易联想到的是,这个问题似乎与公共子串的问题有关系,如果我们能求出两个节点到根节点的路径,再使用匹配算法得到公共的路径,取这个路径上最后一个节点,即是所求的最低公共祖先节点. 哈夫曼编码启迪了我,我打算使用 0 表示向左走,1 表示向右走.如,101 表示自根节点,走到右孩子 A,再走到 A 的左孩子 B,再走到 B 的右孩子 C .于是,根节点到节点 C

二叉树求两节点最低公共祖先,求随意两节点距离

-------1.求最低公共祖先LCA( Lowest Common Ancestor ) 什么是最低公共祖先?例如以下图.2与3的LCA是1:1与4的LCA是1:4与5的LCA是2. 那么给定两个节点n1和n2,如今要找出它们的LCA,怎样找?首先分析一下,n1和n2有几种情况?第一种.n1和n2分别在一个节点的左右子树中,比方4和5,LCA就是2,5和6,LCA就是1.2和3,LCA就是1:另外一种.n1和n2都在左子树或右子树,比方2和4,LCA就是2,1和4.LCA就是1. 一共这两种情

求二叉树的最低公共祖先

这个题目来讲,应该是在二叉树里面较为容易的题目了.那么如何下手呢?其实对于这样一棵二叉树来讲. 我们如何求它们的最低公共父节点呢? 假如是要你求5.6的公共父节点,那么是3.啰 为什么是3? 因为3的左子树是5,而右子树是6啰. 那么7.8的最低公共祖先呢? 1啊,因为1的左子树中有7.而1的右子树中有8啊. 那么思路来了.我们只要证明某一节点的左子树和右子树分别包含这两个节点就行了. 于是思路来了. 源代码: 注意:在本题中为了方便 ,我们传入的两个节点的值,而不是两个节的地址,呵呵,为了方便

编程算法 - 二叉树的最低公共祖先 代码(C)

二叉树的最低公共祖先 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉树的最低公共祖先(lowest common ancestor), 首先先序遍历找到两个结点的路径, 然后依据链表路径找到最低的公共祖先. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include