四叉树考察了递归,我一直对递归的思想不是特别理解,最后还是看了其他人的题解才写出来。
具体是每次都比较两个四叉树的相同节点,
①如果两个都是叶子节点,且其中有一个的val为true;则返回该节点。若都是叶节点,但是其中一个是false,则返回另一个节点。
②如果两个节点都不是叶节点,则依次比较它们的相同位置节点;此处就是递归的地方,
③递归的终点是四个节点的返回都是叶节点并且它们的val相等,则返回其中一个val,合并为一个节点。 否则,必然不是只有一个节点,isLeaf=false,val自然也是false,四个对应的叶节点就是对应返回的叶节点。
class Solution {
public Node intersect(Node quadTree1, Node quadTree2) {
if(quadTree1.isLeaf && quadTree1.val) return quadTree1;
if(quadTree2.isLeaf && quadTree2.val) return quadTree2;
if(quadTree1.isLeaf && !quadTree1.val) return quadTree2;
if(quadTree2.isLeaf && !quadTree2.val) return quadTree1;
Node n1 = intersect(quadTree1.topLeft, quadTree2.topLeft);
Node n2 = intersect(quadTree1.topRight, quadTree2.topRight);
Node n3 = intersect(quadTree1.bottomLeft, quadTree2.bottomLeft);
Node n4 = intersect(quadTree1.bottomRight, quadTree2.bottomRight);
if(n1.val == n2.val && n1.val==n3.val && n1.val==n4.val && n1.isLeaf &&n2.isLeaf && n3.isLeaf && n4.isLeaf)
return new Node(n1.val, true, null, null, null, null);
else
return new Node(false, false, n1,n2,n3,n4);
}
}
二,两数相加
这道题是中等难度,乍一看还比较简单,我感觉比上一道简单一点,写倒是写出来了,就是有些小bug,而且不够优化,改了改就改的不成样子了,,,
最后参考了题解,是真的简洁。
ListNode ree = new ListNode(0);
ListNode re = ree;
int index = 0;//进位
while(l1!=null || l2!=null)
{
int a = (l1!=null) ? l1.val : 0;
int b = (l2!=null) ? l2.val : 0;
int sum = a+b+index;
index = sum/10;
re.next = new ListNode(sum%10);
re = re.next;
if(l1!=null) l1 = l1.next;
if(l2!=null) l2 = l2.next;
}
if(index>0)
re.next = new ListNode(index);
return ree.next;
这里先设置返回了两个ListNode,其中一个用来返回,这里我没想到。 还有一个是在相加的时候,re的next节点的设置,要先初始化节点在re=re.next. 是我的语言问题。