四叉树交集

558. 四叉树交集

解题思路

递归,我是在 q u a d T r e e 1 quadTree1 quadTree1的基础上直接修改的,题目很长可能理解有点困难

实际上只要考虑叶子节点的值,以及它是否会影响父亲节点成为叶子节点(题目中说明了这种情况)

t 、 p t、p tp分别为当前节点

  1. 都是叶子节点 直接计算或的结果 赋给 t t t 它是要改变的树

  2. t t t 是叶子节点 考虑它的 v a l val val

    1. v a l val val=1 直接返回,1 | 任意数都是1
    2. v a l val val=0 把 p p p节点赋给 s s s,0 | 任意数都是任意数本身
  3. s s s是叶子节点 同理2

坑点: t = p t=p t=p直接赋值不行

代码
相比官方题解 新建Node不会修改原四叉树,而且更好看一点
Node* intersect(Node* quadTree1, Node* quadTree2) {
    Node* t = quadTree1;
    Node* p = quadTree2;
    solve(t, p);
    return quadTree1;
}
void solve(Node* t, Node* p)
{
    if(t->isLeaf&&p->isLeaf)
    {
        t->val = t->val|p->val;
        p->val = t->val;
        return;
    } else if(t->isLeaf){
        if(!t->val)
        {
            t->val = p->val;
            t->isLeaf = p->isLeaf;
            t->topLeft = p->topLeft;
            t->topRight = p->topRight;
            t->bottomLeft = p->bottomLeft;
            t->bottomRight = p->bottomRight;
        }
        return;
    } else if(p->isLeaf) {
        if(p->val)
        {
            t->val = p->val;
            t->isLeaf = p->isLeaf;
            t->topLeft = p->topLeft;
            t->topRight = p->topRight;
            t->bottomLeft = p->bottomLeft;
            t->bottomRight = p->bottomRight;
        }
        return;
    }
    solve(t->topLeft, p->topLeft);
    solve(t->topRight, p->topRight);
    solve(t->bottomLeft, p->bottomLeft);
    solve(t->bottomRight, p->bottomRight);
    if(t->topLeft->isLeaf&&t->topRight->isLeaf&&t->bottomLeft->isLeaf&&t->bottomRight->isLeaf&&t->topLeft->val==t->topRight->val&&t->topRight->val==t->bottomLeft->val&&t->bottomLeft->val==t->bottomRight->val)
    {
        t->isLeaf=true;
        t->val = t->topLeft->val;
        t->topLeft = NULL;
        t->topRight = NULL;
        t->bottomLeft = NULL;
        t->bottomRight = NULL;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值