搜索二叉树中两个节点的最近公共祖先

版权声明:本文为博主原创文章,未经博主允许不得转载。 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]

image

思路

二叉树中的题基本跑不过遍历,二叉树中有四种遍历方式,根据题意应该是从最下面当最上面的过程,所以可以确定遍历的方法是后序遍历。
后序遍历还是采用递归的形式描述,既然使用递归就需要确定递归公式。递归公中包含base case,还会告诉我们如何进行递归。下面给出递归公式:

  1. 当前为空直接返
  2. 当前节点是两个待查询中的一个直接返回
  3. 递归的查找左子树
  4. 递归的查找右子树
  5. 左右子树都不为空,当前节点就是最近公共祖先,直接返回
  6. 左右子树都为空,以当前节点为根节点的BST中不包含,返回空
  7. 左右子树有一个为空,一个非空,那么非空的那个子树的根节点分两种情况,可能是待查询两个节点的一个,两种情况这个节点都是两个节点的最近公共祖先,返回这个节点

代码

/**
 * 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。微信公众号:后台技术栈。二维码如下:image

猜你喜欢

转载自blog.csdn.net/king_qg/article/details/85994836