题目:
思路:
两次遍历二叉树,首先遍历全部的二叉树节点。在遍历的同时判断每个二叉树的节点是否为p,q的公共祖先。如果是公共祖先 用一个变量ans 存储该节点。然后重复此过程最终ans一定是最近公共最先。 为什么ans最终一定为最近公共祖先:我想的是在遍历的过程中一直在找全部的公共最先并且第一次遍历是先序遍历,是从根节点逐渐向下遍历。所以找到的公共祖先离p,q越来越近。(至于怎么证明我不会)
/**
* @auther start
* @create 2024-02-08 10:32
*/
public class L236 {
//ans存储公共最先
TreeNode ans;
//如果找到了p,q,使用这两个变量标记
boolean pTrue, qTrue;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
ans = new TreeNode();
dfsTmp(root,p,q);
return ans;
}
//判断节点树中是否存在p,q
public void dfs(TreeNode root, TreeNode p, TreeNode q){
if (root == null) return;
if (root == p) pTrue = true;
if (root == q) qTrue = true;
dfs(root.left,p,q);
dfs(root.right,p,q);
}
//第一次遍历,遍历全部的节点,先序遍历
public void dfsTmp(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return;;
//判断这个节点树是否有p,q
dfs(root,p,q);
//如果这个节点树中有p和q使用ans保存
if (pTrue && qTrue) ans = root;
//恢复变量为默认状态
pTrue = false;
qTrue = false;
dfsTmp(root.left,p,q);
dfsTmp(root.right,p,q);
}
}