今天开始刷力扣100,每天都刷,不刷是狗
满二叉树和完全二叉树区别
- 满二叉树是完全二叉树的一个特例,满二叉树所有节点都是
- 完全二叉树的左边节点都有,但是右边节点可以没有
合并二叉树
方法一:递归法
终止条件,两棵树的任意一颗没有即终止
既是终止条件,也是判断corner case
if not t1:
return t2
if not t2:
return t1
每个递归中的任务:
t3=TreeNode(t1.val+t2.val)
执行递归,左右子树的递归
t3.left=self.merge(t1.left,t2.left)
t3.right=self.merge(t1.right,t2.right)
方法二 迭代法or广度优先遍历
需要借助额外的队列实现
首先也是判断corner case
if not t1:
return t2
if not t2:
return t1
先把t1,t2放入队列中
queue=[(t1,t2)]
开始遍历queue
while queue:
r1,r2=queue.pop(0)
if r1.left and r2.left:
queue.append((r1.left,r2.left))
elif not r1.left:
r1,left=r2.left
if r1.right and r2.right:
queue.append((r1.right,r2.right))
elif not r1.right:
r1.right=r2.right
return t1
合并两个有序链表
也有两种方法,递归和迭代
方法一,递归
if not l1:
return l2
if not l2:
return l1
if l1.val<l2.val:
l1.next=self.mergelist(l1.next,l2)
return l1
else:
l2.next=self.mergelist(l1,l2.next)
return l2
方法二,迭代
dummy=ListNode(-1)
pre=dummy
while l1 and l2:
if l1.val<l2.val:
pre.next=l1
l1=l1.next
else:
pre.next=l2
l2=l2.next
pre=pre.next
pre.next=l1 if not l2 else l1
return dummy.next