力扣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 } }

浙公网安备 33010602011771号