解题思路
递归,我是在 q u a d T r e e 1 quadTree1 quadTree1的基础上直接修改的,题目很长可能理解有点困难
实际上只要考虑叶子节点的值,以及它是否会影响父亲节点成为叶子节点(题目中说明了这种情况)
设 t 、 p t、p t、p分别为当前节点
-
都是叶子节点 直接计算或的结果 赋给 t t t 它是要改变的树
-
t t t 是叶子节点 考虑它的 v a l val val
- v a l val val=1 直接返回,1 | 任意数都是1
- v a l val val=0 把 p p p节点赋给 s s s,0 | 任意数都是任意数本身
-
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;
}
}