二叉树之找祖先

发布于:2024-05-23 ⋅ 阅读:(121) ⋅ 点赞:(0)

第一题:

找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);
    }
};


网站公告

今日签到

点亮在社区的每一天
去签到