文章目录
104. 二叉树的最大深度(递归最大深度)
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
-
说明: 叶子节点是指没有子节点的节点。
-
示例:
给定二叉树 [3,9,20,null,null,15,7],3 / \ 9 20 / \ 15 7
返回它的最大深度 3 。
递归左右子树,计算就可以,进一层,加1
# 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 maxDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root == None:
return 0
else:
l = self.maxDepth(root.left)+1
r = self.maxDepth(root.right)+1
return max(l,r)
111. 二叉树的最小深度(递归最大深度)
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
-
说明: 叶子节点是指没有子节点的节点。
-
示例:
给定二叉树 [3,9,20,null,null,15,7],3 / \ 9 20 / \ 15 7
返回它的最小深度 2.
还是和求最大深度的思路一样,只是 max 换成 min,但是要注意只有一个 方向的分支的情况!这个时候如果仅仅把 max 换成 min,会输出 1 的,显然不是我们想要的!为了避免这种情况,加了 if 讨论
# 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 minDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root == None:
return 0
else:
l = self.minDepth(root.left)+1
r = self.minDepth(root.right)+1
if l == 1: # 防止一个方向的二叉树
return r
elif r == 1:
return l
else:
return min(l,r)
559. N叉树的最大深度(递归最大深度)
给定一个 N 叉树,找到其最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
例如,给定一个 3叉树 :
我们应返回其最大深度,3。
- 说明:
树的深度不会超过 1000。
树的节点总不会超过 5000。
这里的子树就不是 left 和 right 了,是 children,是一个列表,还是 DFS 那套
"""
# Definition for a Node.
class Node(object):
def __init__(self, val, children):
self.val = val
self.children = children
"""
class Solution(object):
def maxDepth(self, root):
"""
:type root: Node
:rtype: int
"""
if root == None: # 空树
return 0
elif root.children == []: # 只有根节点
return 1
else: #递归个个子树,然后返回最深的结果
return max(self.maxDepth(i) for i in root.children) + 1
注意,self.maxDepth(i) for i in root.children
如果写成 self.maxDepth(i for i in root.children)
就是 generator 了!
110. 平衡二叉树(递归最大深度)
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
-
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3 / \ 9 20 / \ 15 7
返回 true 。
-
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]1 / \ 2 2 / \ 3 3 / \ 4 4
返回 false 。
# 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 isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
# 递归算法从叶节点往根节点推
# 先找到最后的叶子结点,从叶子结点开始一步步返回是否平衡
if root == None:
return True
elif abs(self.height(root.left) - self.height(root.right)) > 1: # 根节点左右子树不平衡,false
return False
else: # 可能存在子树不平衡的情况,递归下去
return self.isBalanced(root.left) and self.isBalanced(root.right)
# 递归求树的最大深度
def height(self, root):
if root == None:
return 0
else:
l = self.height(root.left) + 1
r = self.height(root.right) + 1
return max(l,r)
513. 找树左下角的值(递归 BFS)
给定一个二叉树,在树的最后一行找到最左边的值。
-
示例 1:
输入:2 / \ 1 3
输出:
1
- 示例 2:
输入:
1
/ \
2 3
/ / \
4 5 6
/
7
输出:
7
思路:树的层次遍历,每进入下一层,清空记录的值,返回最后一层的第一个元素
# 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 findBottomLeftValue(self, root):
"""
:type root: TreeNode
:rtype: int
"""
root_list = [root] #第一层的根节点
while(root_list):
tmp_root_list = [] #每一层的根节点列表
value = [] #记录元素的值,每一层都清空
for node in root_list:
if node.left:
tmp_root_list.append(node.left)
if node.right:
tmp_root_list.append(node.right)
value.append(node.val)
root_list = tmp_root_list
return value[0] # 返回最后一层的第一个元素
144. 二叉树的前序遍历(前序遍历)
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
递归如下
# 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 preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
val = []
if root == None:
return val
else:
val.append(root.val)
val.extend(self.preorderTraversal(root.left))
val.extend(self.preorderTraversal(root.right))
return val
589. N叉树的前序遍历(前序遍历)
给定一个 N 叉树,返回其节点值的前序遍历。
例如,给定一个 3叉树 :
返回其前序遍历: [1,3,5,6,2,4]。
1)递归
"""
# Definition for a Node.
class Node(object):
def __init__(self, val, children):
self.val = val
self.children = children
"""
class Solution(object):
def preorder(self, root):
"""
:type root: Node
:rtype: List[int]
"""
value = [] # 存放遍历后的值
if root == None: # 为空返回 []
return value
else:
value.append(root.val) # 保存根节点的值
for node in root.children: # 遍历每个子节点,递归调用先序遍历
value.extend(self.preorder(node))
return value
2)迭代
bryant
94. 二叉树的中序遍历(中序遍历)
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
思路:调换一下前序遍历的顺序即可
# 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 inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
val = []
if root == None:
return val
else:
val.extend(self.inorderTraversal(root.left))
val.append(root.val)
val.extend(self.inorderTraversal(root.right))
return val
230. 二叉搜索树中第K小的元素(中序遍历)
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 1
思路:中序遍历二叉搜索树可以得到有序(从小到大)的结果,然后返回第 k 个值
# 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 kthSmallest(self, root, k):
"""
:type root: TreeNode
:type k: int
:rtype: int
"""
def inorderTraversal(root): # 定义中序遍历函数
val = []
if root == None:
return val
else:
val.extend(inorderTraversal(root.left))
val.append(root.val)
val.extend(inorderTraversal(root.right))
return val
return inorderTraversal(root)[k-1]
145. 二叉树的后序遍历(后序遍历)
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
思路:调整下前序遍历的顺序即可
# 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 postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
val = []
if root == None:
return val
else:
val.extend(self.postorderTraversal(root.left))
val.extend(self.postorderTraversal(root.right))
val.append(root.val)
return val
590. N叉树的后序遍历(后序遍历)
给定一个 N 叉树,返回其节点值的后序遍历。
例如,给定一个 3叉树 :
返回其后序遍历: [5,6,3,2,4,1].
思路:在二叉树后续遍历的基础上,循环遍历 children 即可
"""
# Definition for a Node.
class Node(object):
def __init__(self, val, children):
self.val = val
self.children = children
"""
class Solution(object):
def postorder(self, root):
"""
:type root: Node
:rtype: List[int]
"""
val = []
if root == None:
return val
else:
for node in root.children:
val.extend(self.postorder(node))
val.append(root.val)
return val
617. 合并二叉树(递归)
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
注意: 合并必须从两个树的根节点开始。
# 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 mergeTrees(self, t1, t2):
"""
:type t1: TreeNode
:type t2: TreeNode
:rtype: TreeNode
"""
if t1 == None: #这两个判断很关键,弥补了二叉树形状不一样的情况
return t2
elif t2 == None:
return t1
else:
t1.val = t1.val+t2.val # 根节点的值相加,保存在t1中
t1.left = self.mergeTrees(t1.left,t2.left)# 递归左子树
t1.right = self.mergeTrees(t1.right,t2.right)# 递归右子数
return t1
注意不等长时候的处理!!!