二叉搜索树的最近公共祖先
问题简述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
如果是普通二叉树呢?
思路1:基于二叉搜索树
根据二叉搜索树的性质:左子树都小于父节点,右子树都大于父节点,快速找出指定节点的父节点路径;
然后找出最近的公共祖先;
优化1:根据二叉搜索树的定义,如果一个节点 node 是 p 和 q 的祖先,则有 node 同时 >= 或 <= p 和 q;因此可以优化为一次遍历;
优化2:若可保证 p.val < q.val
,则在循环中可减少判断条件。
思路2:普通二叉树
思路1 利用了二叉搜索树的性质快速获取祖先路径;
可以不利用二叉搜索树的性质来获取祖先路径(对非二叉搜索树也适用);
因为必须先找到目标节点才能确定路线,所以可以考虑后序遍历;当找到目标节点时,返回 flag,指示上级节点是否为祖先节点;
优化:不使用额外空间存储祖先路径,即在遍历过程中判断;
如果 node 仅是 p 和 q 的公共祖先(但不是最近公共祖先),那么 node 的左右子树之一必也是 p 和 q 的公共祖先;
如果 node 是 p 和 q 的最近公共祖先,那么 node 的左右子树都不是 p 和 q 的公共祖先;
根据以上两条性质,可知,如果 node 是 p、q 的最近公共祖先,有:
node 是 p、q 的公共祖先,且 p 和 q 分别在 node 的两侧;
node 是 p 或 q 之一,且是另一个节点的祖先;
Last updated