给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof
说明:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉搜索树中。
写这道题的时候忘了之前是怎么写的了,现在脑子里碰到二叉树就是那几种遍历。思路是用前序,因为是搜索二叉树,左边小于中间小于右边。如果一个节点被p和q夹在中间,那这个节点就是他们的公共祖先。
迭代:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return
stack = [root]
while stack:
node = stack.pop()
if p.val<=node.val and q.val>=node.val: #有等的情况
return node
elif p.val>=node.val and q.val<=node.val: #因为不晓得q和p哪个大哪个小,所以写个elif
return node
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
这种思路的递归没写出来,因为有些感觉不需要遍历,还有就是不好return,晓得咋写的麻烦评论告诉我。
以前的思路:感觉有点像前序又不是,因为遍历的时候不用像前序一样回溯。直接往下找就行了。如果两个都小于当前根就往左找,两个都大于当前根就往右找。否则公共祖先就是当前根。
迭代:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return
while root:
if p.val<root.val and q.val<root.val:
root = root.left
elif p.val>root.val and q.val>root.val:
root = root.right
else:
return root
递归:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
def loop(root):
if not root:
return
if p.val<root.val and q.val<root.val:
return loop(root.left)
elif p.val>root.val and q.val>root.val:
return loop(root.right)
else:
return root
return loop(root)