首页 > 试题广场 >

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

[编程题]二叉搜索树的最近公共祖先
  • 热度指数:80298 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.
2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值
3.所有节点的值都是唯一的。
4.p、q 为不同节点且均存在于给定的二叉搜索树中。
数据范围:
3<=节点总数<=10000
0<=节点值<=10000

如果给定以下搜索二叉树: {7,1,12,0,4,11,14,#,#,3,5},如下图:


示例1

输入

{7,1,12,0,4,11,14,#,#,3,5},1,12

输出

7

说明

节点1 和 节点12的最近公共祖先是7   
示例2

输入

{7,1,12,0,4,11,14,#,#,3,5},12,11

输出

12

说明

因为一个节点也可以是它自己的祖先.所以输出12   

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
func lowestCommonAncestor( root *TreeNode ,  p int ,  q int ) int {
    arr1 := searchNum(root, p)
    arr2 := searchNum(root, q)

    var commonNode int
    for _, v1 := range arr1 {
        for _, v2 := range arr2 {
            if v1 == v2 {
                commonNode = v1
            }
        }
    }

    return commonNode
}

// 找寻目标数,返回查找路径
func searchNum(root *TreeNode, num int) []int {
    arr := []int{}
    for root.Val != num {
        arr = append(arr, root.Val)
        if root.Val > num {
            // 目标数在root节点的左树
            root = root.Left
        } else {
            root = root.Right
        }
    }

    arr = append(arr, num)

    return arr
}

发表于 2024-04-09 10:07:21 回复(0)
func lowestCommonAncestor( root *TreeNode ,  p int ,  q int ) int {
    // write code here
    tmp:=root
    for{
        if p< tmp.Val && q<tmp.Val{
            tmp=tmp.Left
        }else if p>tmp.Val && q >tmp.Val{
            tmp=tmp.Right
        }else{
            return tmp.Val
        }
    }
}

发表于 2022-04-05 01:46:00 回复(1)
type TreeNode struct {
    Val int
    Left *TreeNode
    Right *TreeNode
}

func lowestCommonAncestor(root *TreeNode ,  p int ,  q int ) int {
    if root == nil || root.Val == p || root.Val == q {
        return root.Val
    }
    if find(root.Left, p) && find(root.Left, q) {
        return lowestCommonAncestor(root.Left, p, q)
    }
    if find(root.Right, p) && find(root.Right, q) {
        return lowestCommonAncestor(root.Right, p, q)
    }
    return root.Val
}

//前序遍历
func find(root *TreeNode, target int) bool {
    if root == nil {
        return false
    }
    if root.Val == target {
        return true
    }
    return find(root.Left, target) || find(root.Right, target)
}

发表于 2022-03-13 23:12:57 回复(1)
package main
// import "fmt"
import . "nc_tools"
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @param p int整型 
 * @param q int整型 
 * @return int整型
*/
func lowestCommonAncestor( root *TreeNode ,  p int ,  q int ) int {
    // write code here
    return find(root,p,q).Val
}



func find(root *TreeNode,p ,q int) *TreeNode {
    if root == nil { return nil }
    if root.Val == p || root.Val ==q { return root }
    var left,right *TreeNode
    left = find(root.Left,p,q)
    right = find(root.Right,p,q)
    if left==nil { 
        return right 
    } else if right == nil { return left }
    
    return root
}






发表于 2022-01-15 00:15:19 回复(0)