二叉树
二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2k-1个叶子节点,至多有2k-1个节点。
leetcode 98
代码实现
这两天考试要考疯了,题目都只是看一遍有个大概思路,遇到难点直接看别人的答案了。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def inOrder(self, root, output):
if root is None:
return
self.inOrder(root.left, output)
output.append(root.val)
self.inOrder(root.right, output)
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
output = []
self.inOrder(root, output)
for i in range(1, len(output)):
if output[i-1] >= output[i]:
return False
return True
上面是递归做法。事实上,因为树本身的递归定义,很多时候都可以用递归来做,而且思路会很简单。当然,有时候需要考虑内存问题。
时间复杂度是O(n+log(n)),总觉得这个应该不是最优解法,不过暂时也想不出更好的。
leetcode 102
代码实现
class Solution:
def levelOrder(self, root):
if not root: return []
queue, res = [root], []
while queue:
cur_level, size = [], len(queue)
for i in range(size):
node = queue.pop(0)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
cur_level.append(node.val)
res.append(cur_level)
return res
时间空间复杂度都是O(n)。
leetcode 107
代码实现
完全copy。实在是有点反应不过来,复杂度就不分析了。
class Solution:
# dfs recursively
def levelOrderBottom1(self, root):
res = []
self.dfs(root, 0, res)
return res
def dfs(self, root, level, res):
if root:
if len(res) < level + 1:
res.insert(0, [])
res[-(level+1)].append(root.val)
self.dfs(root.left, level+1, res)
self.dfs(root.right, level+1, res)
# dfs + stack
def levelOrderBottom2(self, root):
stack = [(root, 0)]
res = []
while stack:
node, level = stack.pop()
if node:
if len(res) < level+1:
res.insert(0, [])
res[-(level+1)].append(node.val)
stack.append((node.right, level+1))
stack.append((node.left, level+1))
return res
# bfs + queue
def levelOrderBottom(self, root):
queue, res = collections.deque([(root, 0)]), []
while queue:
node, level = queue.popleft()
if node:
if len(res) < level+1:
res.insert(0, [])
res[-(level+1)].append(node.val)
queue.append((node.left, level+1))
queue.append((node.right, level+1))
return res