版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/king_qg/article/details/85994836
搜索二叉树中两个节点的最近公共祖先
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”
Given binary search tree: root = [6,2,8,0,4,7,9,null,null,3,5]
思路
二叉树中的题基本跑不过遍历,二叉树中有四种遍历方式,根据题意应该是从最下面当最上面的过程,所以可以确定遍历的方法是后序遍历。
后序遍历还是采用递归的形式描述,既然使用递归就需要确定递归公式。递归公中包含base case,还会告诉我们如何进行递归。下面给出递归公式:
- 当前为空直接返
- 当前节点是两个待查询中的一个直接返回
- 递归的查找左子树
- 递归的查找右子树
- 左右子树都不为空,当前节点就是最近公共祖先,直接返回
- 左右子树都为空,以当前节点为根节点的BST中不包含,返回空
- 左右子树有一个为空,一个非空,那么非空的那个子树的根节点分两种情况,可能是待查询两个节点的一个,两种情况这个节点都是两个节点的最近公共祖先,返回这个节点
代码
/**
* Definition for TreeNode.
* type TreeNode struct {
* Val int
* Left *ListNode
* Right *ListNode
* }
*/
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if root == nil || root == p || root == q {
return root
}
left := lowestCommonAncestor(root.Left, p, q)
right := lowestCommonAncestor(root.Right, p, q)
if left != nil && right != nil {
return root
}
ret := left
if left == nil {
ret = right
}
return ret
}
对比上述的递归公式,把递归公式分层三组,(1,2),(3,4)和(5,7)其实就是后序遍历的框架,1,2是base case,3,4是递归,5,6,7是对当前节点的处理。
关于作者
大四学生一枚,分析数据结构,面试题,golang,C语言等知识。QQ交流群:521625004。微信公众号:后台技术栈。二维码如下: