一:题目
二:上码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
/**
思路:1.这里我们需要的是从底向上开始寻找最近的公共祖先,所以我们要用到后序遍历
2.递归三部曲
(1):确定递归函数和返回值
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
(2):确定递归终止条件
当递归到叶节点时结束,或者是遇到我们要找的结点
if(root == NULL || root == q || root == p) return root;
(3):递归体
我们需要用两个结点接住左子树和右子树返回的结点了 做后续的逻辑处理
TreeNode* left = lowestCommonAncestor( root->left, p, q)
TreeNode* right = lowestCommonAncestor(root->right, TreeNode* p, q)
if(left != NULL && right != NULL) return root;
if(left != NULL && right == NULL) retrun left;
return right;
*/
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL || root == q || root == p) return root;
TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right = lowestCommonAncestor(root->right,p,q);
if(left != NULL && right != NULL) return root;
if(left != NULL && right == NULL) return left;//如果左子树,没有找到目标结点,
//而目标结点在右子树 出现了则要返回
return right;
}
};
对于递归我是真的丝毫没有抵抗力啊 太他**的变态了 我的理解过程全靠人脑压栈 还是做题少 对递归没感觉
求求求递归你了 让我有点感觉吧!!
人脑压栈过程: