力扣236.二叉树的最近公共祖先

 

1.本题是典型的后序遍历,因为要自底向上推出结果。

2.思考递归函数的定义:traverse函数的定义就是返回当前节点的子树是否包含节点p、q其中的一个。

3.当前节点应该做什么:(1)如果root为空,返回false,很合理。(2)保存左子树、右子树的结果。(3)什么情况下得到结果?a.左子树和右子树都是true的时候,直接将结果存进res,并向上层返回flase。b.左子树和右子树中只有一个true,但当前节点就是p或q。(4)什么情况返回true?a.左子树和右子树其中有一个是true。b.左子树和右子树都是flase,但当前节点为p或q。(5)什么情况下返回false?上述情况都不满足,则返回false。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    TreeNode res;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        traverse(root,p,q);
        return res;
    }
    public boolean traverse(TreeNode root, TreeNode p, TreeNode q){
        if(root==null) return false;
        boolean left=traverse(root.left,p,q);
        boolean right=traverse(root.right,p,q);
        if(left==true||right==true){
            if(left==true&&right==true){//找到答案
                res=root;
                return false;
            }
            if(root==p||root==q) {//找到答案
                res=root;
                return false;
            }
            return true;
        }
        if(left==false&&right==false){
            if(root==p||root==q) return true;//根节点的情况
        }
        return false;//都不满足则返回false
    }
}
posted @ 2021-12-08 20:08  开心码码乐  阅读(31)  评论(0)    收藏  举报