每日一题--堂兄弟结点--DFS和BFS详解

题目:

在这里插入图片描述

BFS详解

bfs深度判断就很简单了,只要是同一层遍历的即可,但是父节点判断是个麻烦事,我们可以通过遍历pair中存入父节点以及当前结点即可。

class Solution {
public:
//整体思路:用队列存储的不仅仅是该层的结点,而是存储一个映射关系,即该层结点的上一个父节点是谁也得知道。
    bool isCousins(TreeNode* root, int x, int y) {
        //该变量用于存储,当我们在一个层中寻找到其中一个值后,其对应的父节点
        //如果该值不为nullptr时,则说明已经找到了其中一个值,而这里面存储的就是那个值的父节点
        //所以再次在同一层碰到另一个值,我们只需要判断res与该值父节点不要是同一个就行了
        TreeNode* res = nullptr;

        queue<pair<TreeNode *, TreeNode *>> St;
        St.push({ nullptr, root });
        while (!St.empty()) {
            for (int i = St.size(); i > 0; i--) {
                auto [p, q] = St.front();
                St.pop();
        //当该层出现其中一个值,开始相关判断
                if (q->val == x || q->val == y) {
                    if (res != nullptr && res != p) return true;
                    res = p;
                }
        //把父节点和子节点的映射入栈
                if (q->left) {
                    St.push({ q, q->left });
                }
                if (q->right) {
                    St.push({ q, q->right });
                }
            }
//如果出现res != nullptr,则说明该层出现了其中一个值,或者两个值都出现了,但是为同一父节点。
//这说明这两个值对应的结点不可能为堂兄弟结点了,return false即可
            if (res) return false;
        }
        return false;
    }
};


DFS详解

对dfs而言,由于是通过函数递归实现,那么我们可以通过函数传参为所欲为。

class Solution {
private:
//通过全局变量更新用于查看要寻找的数字的相应层数,以及相应的父节点
    int depthX = -1,depthY = -1;
    TreeNode *xParent = nullptr,*yParent = nullptr;
    //通过dfs搜索更新相应的参数
    void dfs(TreeNode* root,TreeNode* parent,int depth,int x,int y){
        if(!root)
            return;
        if(root->val == x){
            depthX = depth;
            xParent = parent;
        }
        if(root->val == y){
            depthY = depth;
            yParent = parent;
        }
        //剪枝,如果两个值对应的参数都得到了更新,直接进行剪枝
        if(xParent&&yParent&&depthX!=-1&&depthY!=-1)
            return;
        //左右两边继续分治
        dfs(root->left,root,depth+1,x,y);
        dfs(root->right,root,depth+1,x,y);
    }
public:
    bool isCousins(TreeNode* root, int x, int y) {
        dfs(root,nullptr,0,x,y);
        //只有当两个参数更新,且满足父节点不同深度相同,才能return true,否则都是false
        if(xParent&&yParent&&depthX!=-1&&depthY!=-1){
            if(xParent!=yParent&&depthY==depthX)
                return true;
        }
        return false;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值