做淘宝网站用什么浏览器,南昌商城网站设计,wordpress 自带seo,合肥网站建设步骤文章目录 一、题目描述示例 1示例 2 二、代码三、解题思路 一、题目描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为#xff1a;“对于有根树 T 的两个结点 p、q#xff0c;最近公共祖先表示为一个结点 x#xff0c;满足… 文章目录 一、题目描述示例 1示例 2 二、代码三、解题思路 一、题目描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为“对于有根树 T 的两个结点 p、q最近公共祖先表示为一个结点 x满足 x 是 p、q 的祖先且 x 的深度尽可能大一个节点也可以是它自己的祖先。”
例如给定如下二叉搜索树: root [6,2,8,0,4,7,9,null,null,3,5]
示例 1
输入: root [6,2,8,0,4,7,9,null,null,3,5], p 2, q 8
输出: 6
解释: 节点 2 和节点 8 的最近公共祖先是 6。示例 2
输入: root [6,2,8,0,4,7,9,null,null,3,5], p 2, q 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。提示 所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。
二、代码
代码如下
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val x
# self.left None
# self.right Noneclass Solution:def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) - TreeNode:# 寻找p和q节点的父节点如果2者其当前父节点相同或者其中一个的父节点等同于另一个节点则表示找到# 如果当前父节点不相同则继续找当前父节点的父节点直到找到为止p_father []q_father []def findp(r):if r.val p.val:p_father.append(r)returnelif r.val p.val:p_father.append(r)findp(r.left)else:p_father.append(r)findp(r.right)def findq(r):if r.val q.val:q_father.append(r)returnelif r.val q.val:q_father.append(r)findq(r.left)else:q_father.append(r)findq(r.right)findp(root)findq(root)result rootfor i in range(min(len(q_father),len(p_father))):if q_father[i] p_father[i]:result q_father[i]continueelse:breakreturn result 三、解题思路
本题需要寻找的是某2个节点的公共父节点该父节点也可能是节点本身所以本题的解题思路为找出pq这2个节点的所有父节点且包含有pq节点本身。 寻找p或q所有父节点思路为从二叉树搜索树的根开始往下找记录下当前的节点作为其父节点然后根据pq节点的值的大小判断其应该在哪一个分支前往那个分支重复以上操作直到找到p、q节点为止。因为题意保证p、q节点一定在数中存在且唯一所以找到该节点的父节点路径仅有1条 然后根据找到p、q的所有父节点的列表开始从头寻找这2个列表的公共最大子列表找到其公共最大子列表后返回其最后一位节点即可。 例如 p_father [6节点2节点] q_father [6节点2节点4节点] 则p、q父节点列表中的最大公共子列表为[6节点、2节点]则p、q的公共最近父节点为最大公共子列表的最后一项——2节点。 又例如 p_father [6节点2节点] q_father [6节点8节点] 则p、q父节点列表中的最大公共子列表为[6节点]则p、q的公共最近父节点为6节点。