算法分析与设计第六周:236. Lowest Common Ancestor of a Binary Tree

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        p_father.clear();
        q_father.clear();
        //为两个目标节点寻找father
        findFather(root, p, 0);
        findFather(root, q, 1);
        //将得到的father组进行对比,因为是dfs从目标节点开始回溯添加father
        //所以从vector第一个元素开始搜索即可得到最小的祖先
        for (int i = 0; i < p_father.size(); i++) {
            for (int j = 0; j < q_father.size(); j++) {
                if (p_father[i] == q_father[j])
                    return p_father[i];
            }
        }
    }
private:
    //p_father向量用于保存p的father
    //q_father向量用于保存q的father
    vector<TreeNode*> p_father;
    vector<TreeNode*> q_father;

    //使用DFS从根开始搜索,若找到目标节点,则从目标节点开始回溯,并将father逐个加入向量中
    bool findFather(TreeNode* root, TreeNode* target, bool p0Orq1) {
        if (root != nullptr) {
            if (root == target) {
                if (p0Orq1) q_father.push_back(root);
                else p_father.push_back(root);
                return true;
            }
            bool leftFound = findFather(root->left, target, p0Orq1);
            if (leftFound) {
                if (p0Orq1) q_father.push_back(root);
                else p_father.push_back(root);
                return true;
            }
            bool rightFound = findFather(root->right, target, p0Orq1);
            if (rightFound) {
                if (p0Orq1) q_father.push_back(root);
                else p_father.push_back(root);
                return true;
            }
        }
        return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值