本文最后更新于619 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
视频讲解:https://www.bilibili.com/video/BV1jd4y1B7E2
1.这个题还是递归的思路先做一下,然后二刷再进行进一步的了解,对于这个题我想我的困难点在于每次递归的时候,脑子里没有递归到某一个节点的时候的流程,例如本题,将下面带有p q的节点返回给上一节点的时候的处理逻辑,我没有厘清,就是当left == NULL && right != NULL的时候这个部分应该是递归返回值从下向上返回节点的时候,这个节点的左侧没有找到p q然后右面携带着p q的节点也就是答案被返回值返回给这个节点,让他们带着这个最近的公共祖先也就是答案返回给根节点,在这个地方,我没想通,最后明白了,是要将这次迭代的节点的右结点返回回来。所以是return right。这个是我这个最近做迭代的双指针的题的又一个大收获。
CPP
/**
* 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:
TreeNode* traversal(TreeNode* node , TreeNode* p , TreeNode* q){
if(node == NULL)return NULL;
if(node == p || node == q)return node;
TreeNode* left = traversal(node->left , p , q);
TreeNode* right = traversal(node->right , p , q);
if(left == NULL && right == NULL)return NULL;
else if(left != NULL && right == NULL)return left;
else if(left == NULL && right != NULL)return right;
else return node;
return node;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return traversal(root , p , q);
}
};