第一题:
找p和q两个节点的最近公共祖先
思路:
先找到p值或者q值,然后往上return,如果左右不为空return到cur,如果部分为空,那么return没有空的。如果全为空return空。直到return到最上面
实现:递归首先递往下发散,遇到空或者p,q时停止,所以确定终止条件。然后归,判断如果左右不为空return到cur,如果部分为空,那么return没有空的。如果全为空return空。直到return到最上面。
这里需要一个东西就是左右值来接收递归的返回值
代码如下:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
//使用的是后续遍历发
//思路在二叉树往下的过程中遇到null或者遇到p,q就停止了,然后再往回上升直到两个位于左右的位置
if(root == NULL || root == p || root == q)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 right;
else if(left != NULL && right == NULL)return left;
else return NULL;
}
};
下面是第二题:
对二叉搜索数进行找公共祖先
思路:
首先直到最重要的一点就是如果q和p分别在当前节点的左边和右边,那么当且节点就是最近公共祖先。所以如果在右边就往右递,如果在左边就往左递。递到底层时,或者恰好在左右时返回。
内容:在递归体里面需要加上判断语句,如果left或者righ不为空那么就返回。最后在加一个返回,防止归的时候还是空的情况,和在中间的情况。
看代码:
class Solution {
public:
TreeNode* order(TreeNode* cur, TreeNode* p,TreeNode* q)
{
if(cur == NULL)return cur;
if(cur->val > p->val && cur->val > q->val)
{
TreeNode* left = order(cur->left,p,q);
if(left != NULL)
{
return left;
}
}
if(cur->val < p->val && cur->val < q->val)
{
TreeNode* right = order(cur->right,p,q);
if(right != NULL)
{
return right;
}
}
return cur;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
return order(root,p,q);
}
};