给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
查询对称二叉树,主要用途在于判断一个二叉树的左右子树是否镜像对称,这里有个难的地方就是判断需要左子树判断右子叶和右子树的左子叶进行匹配。可以想到的是直接用递归去做。要是能想清楚还比较容易。将二叉树进行双端遍历,匹配。
class Solution(object):
def isSmyle(self,root):
def smy(p,q):
# 判断两个子树是否同时结束
if not p and not q:return True
# 判断错误条件,有只有一个子树存在或者两个子树的值不一样
if not p or not q or p.val != q.val:return False
return rev(p.left,q.right) and rev(p.right,q.left)
return rev(root,root)
还有剩下的方法就是用队列来算
class Solution:
def issymmer(self,root):
if not root:return True
q = collections.deque()
q.append((root,root))
while q:
left,right = q.popleft()
if not left and not right:continue
if not left or not right or left.val != right.val:return False
q.append((left.left,right.right))
q.append((left.right,right.left))
return True
为了确保当前的内容当中,需要有
class Solution:
def issymmer(self,root):
if not root:return True
q = [root.left,root.right]
while q:
left = q.pop(0)
right = q.pop(0)
# 这里要确认,如果都为空需要继续,知道判断完全
if not left and not right:continue
if not left or not right or left.val != right.val:return False
q+= [left.left,right.right]
q+= [left.right,right.left]
return True
参考评论去的大佬答案。
这里的队列用法我还不怎么熟练,想到剑指offer里面有个用队列判断遍历二叉树的题目。
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
思考。单纯的遍历当让无法实现,需要从上往下大勇二叉树需求,还需要从左到右打印, 就算是用栈,但是你遍历左子树无法确定右子树是否在。
class Solutiion:
def levelOrder(self, root):
# 1 先进行判断为空的情况
if not root:return []
res, q = [], collections.deque()
# 先将当前的树放到队列里面
q.append(root)
# q = [root]
while q:
node = q.popleft()
# node = q.pop(0)
res.append(node.val)
if node.left:q.append(node.left)
if node.right:q.append(node.right)
return res
剑指 Offer 32 - II. 从上到下打印二叉树 II
难度简单241
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其层次遍历结果:
[ [3], [9,20], [15,7] ]
这道题也是,主要是要判断当前层的数量,。
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:return []
res, q = [], [root]
while q:
tmp = []
for _ in range(len(q)):
node = q.pop(0)
tmp.append(node.val)
if node.left:q.append(node.left)
if node.right:q.append(node.right)
res.append(tmp)
return res
剑指 Offer 32 - III. 从上到下打印二叉树 III
难度中等241
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其层次遍历结果:
[ [3], [20,9], [15,7] ]
思路相同,大体上也是要说,如果你是第一层,就需要判断加上当前的数值。
class Solution:
def levelorder(self,root):
#前面和之前的一样
res, q = [], collections.deque([root]) # 这里的root需要成列表的形式
while q:
tmp = [] # 创建一个临时的列表
# 当然这里的temp可以用队列来建立,结果下面的添加代码有所不同而已
#tmp = collections.deque()
for _ in range(len(q)):
node = q.popleft()
# 这里需要做的一个判断就是需要选择性地在列表当中添加数值
if len(node) % 2:tmp.insert(0,node.val) # tmp.appendleft(node.val)
else:tmp.append(node.val)
if node.left:q.append(node.left)
if node.right:q.append(node.right)