1. 程式人生 > 其它 >力扣236.二叉樹的最近公共祖先

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