1、对称二叉树(101)
题目描述:
【简单】
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
思路分析:
1、判断是否镜像对称,往小的说需要判断左右子树是否对称:它们的两个根结点具有相同的值且左子树的右子树都与右子树的左子树相等,左子树的左子树与右子树的右子树相等。
2、显而易见的情况,可使用递归的方式来判断
3、递归的终止条件:
-
两个为空,返回True
-
两边不对称,有左边没右边,有右边没左边即一个为空,返回False
-
左子树!=右子树,返回False
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
if not root:
return True
def dfs(left,right):
# 递归的终止条件是两个节点都为空
# 或者两个节点中有一个为空
# 或者两个节点的值不相等
if not (left or right):
return True
elif not(left and right):
return False
elif left.val!=right.val:
return False
return dfs(left.left,right.right) and dfs(left.right,right.left)
return dfs(root.left,root.right)
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
2、左叶子之和(404)
题目描述:
【简单】
计算给定二叉树的所有左叶子之和。
3
/ \
9 20
/ \
15 7
在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
思路分析:
1、一个节点为「左叶子」节点,当且仅当它是某个节点的左子节点,并且它是一个叶子结点(没有左、右孩子)。
2、对整棵树进行遍历,当我们遍历到节点时,如果它的左子节点是一个叶子结点,那么就将它的左子节点的值累加计入答案。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def sumOfLeftLeaves(self, root: TreeNode) -> int:
if not root:
return 0
sum_=0
if root.left and root.left.left==None and root.left.right==None:
sum_+=root.left.val
return self.sumOfLeftLeaves(root.left)+self.sumOfLeftLeaves(root.right)+sum_
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
3、最长同值路径(687)
题目描述:
【中等】
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:
2
思路分析: