一:题目
二:上码
/*** 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;}
};
对于递归我是真的丝毫没有抵抗力啊 太他**的变态了 我的理解过程全靠人脑压栈 还是做题少 对递归没感觉
求求求递归你了 让我有点感觉吧!!
人脑压栈过程: