这是一个很不错的题目,让我复习了从叶子节点遍历到根节点的方法。
在说着提之前,我们来说说后续遍历:
后序遍历是一个左右中的方式,当我们画好二叉树的 图,更着遍历一遍的时候,就会发现:
左边完了去右边,右边完了再去中间。
是不是有一种从写往上遍历的感觉!!!
咱们来仔细分析一下这个题:
公共祖先是啥?
就是同一个或间接的根节点。
我们第一个想到的就是头部根节点,它是所有节点的公共祖先。
这题说,求最近的公共祖先。
也就是可以这样认为:
一个根节点,左边有p或者q,右边有p或者。
题目说了,所有元素不会重复,p,q也一样。
所以,我们就可以利用后续遍历,然后判断每次的节点左右是否满足这个条件,
当然,其中有几个多的条件:
当左右节点都为空时,返回当前根节点。
当左节点不为空,就返回左节点,右节点不为空,返回右节点。
想法肯定简单,实现起来,就烧脑了:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
return dfs(root, p, q);
}
private TreeNode dfs(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) {
return null;
}
if (root.val == p.val) {
return p;
} else if (root.val == q.val) {
return q;
} else {
TreeNode l = dfs(root.left, p, q);
TreeNode r = dfs(root.right, p, q);
if (l != null && r != null) {
return root;
} else if (l != null) {
return l;
} else if (r != null) {
return r;
} else {
return null;
}
}
}
}
本体思路我确实看的别人的,但是这个代码确确实实时自己写的,难度确实不大,思路很重要,我得多去看看别人的思路,好好学学了~