在博客当中看到了一个对二叉树的最近公共祖先的巧解,代码也很是简单,特此用博客记录一下别人大神的思路。
思路来自:http://blog.csdn.net/github_34514750/article/details/52229129
遍历判断两个node是否在左右子树中
一般递归都分为两块返回值;
第一块返回值(开头):
针对l或者r的返回,也就是标记,我自己称为小返回
第二块返回值(结尾):
l和r已经获取完毕,对上一层的返回,我自己称为大返回
public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // 左右子树探索时发现目标节点,则通过返回值标记 if(root == null || p == root || q == root) { return root; } // 查看左子树中是否有目标结点,没有为null TreeNode l = lowestCommonAncestor(root.left,p,q); // 查看右子树中是否有目标结点,没有为null TreeNode r = lowestCommonAncestor(root.right,p,q); //都不为空,说明做右子树都有目标结点,则公共祖先就是本身 if(l!= null && r!= null) { return root; } // 其他情况,则要继续向上标记,显示此节点下边有目标节点 return l != null?l:r; } }
这种解法适用于各类二叉树的最近公共祖先的解法。无需考虑是否是搜索树。很是巧妙,并且代码简单易读、