二叉树专题(3)


100. 相同的树 Same Tree


pq

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。


示例 1:

06e4fb89724cc4ab2cb6939e826d7115.jpeg



输入:p = [1,2,3], q = [1,2,3]

输出:true


示例 2:

14d8d837f4bd950c6f45708d5a1e697b.jpeg

输入:p = [1,2], q = [1,null,2]

输出:false


示例 3:

fabf0d468bbb9840e212c577e9ebc57b.jpeg

输入:p = [1,2,1], q = [1,1,2]

输出:false


提示:

[0, 100]-10^4 <= Node.val <= 10^4

代码1: 递归

输出:

[1,2,3]

[1,2,3]

true

[1,2]

[1,null,2]


false


代码2: 非递归


1. 定义一个栈,将 p 和 q 按顺序入栈。

2. 当栈不为空时,弹出栈顶元素,判断它们的值是否相等。如果不相等,返回 false。

3. 如果它们的值相等,继续判断它们的左右子树是否相等。如果 p 和 q 的左子树都不为空,则将它们的左子树按顺序入栈。如果 p 和 q 的右子树都不为空,则将它们的右子树按顺序入栈。

4. 如果栈为空,则说明 p 和 q 的所有节点都已经比较完毕,返回 true。




101. 对称二叉树 Symmetric Tree


root

示例 1:

47414d1c60a1ab5c6cb6e16d373e8517.jpeg


输入:root = [1,2,2,3,4,4,3]

输出:true



示例 2:

e7f036f1600a155a6e7274402b8e456a.jpeg

输入:root = [1,2,2,null,3,null,3]

输出:false


提示:

   树中节点数目在范围 [1, 1000] 内

   -100 <= Node.val <= 100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?


代码1:递归



输出:

[1,2,2,3,4,4,3]

true

[1,2,2,null,3,null,3]

false

[1,2,2,null,3,3]

true


代码2: 非递归

使用队列进行迭代,每次将左右子树的节点按照对称的方式入队,然后依次出队进行比较,如果不相等则返回 false,如果相等则继续迭代。



代码3: 中序对称

先中序遍历二叉树,然后判断中序遍历结果是否是对称序列。



102. 二叉树的 Binary Tree Level-order Traversal



root

示例 1:

73bbf077fba8a93f8e1f7c01da26ed96.jpeg



输入:root = [3,9,20,null,null,15,7]

输出:[[3],[9,20],[15,7]]


示例 2:

输入:root = [1]

输出:[[1]]


示例 3:

输入:root = []

输出:[]


提示:

   树中节点数目在范围 [0, 2000] 内

   -1000 <= Node.val <= 1000


代码1: 队列实现广度优先搜索 BFS

从根节点开始,将其加入队列中,然后不断从队列中取出节点,将其左右子节点加入队列中,直到队列为空,遍历完成。在遍历每一层时,将该层的节点值加入结果数组的末尾。


输出:

[[3] [9 20] [15 7]]

代码2: 递归实现深度优先搜索 DFS

对于每一层,先遍历左子树,然后遍历右子树,直到遍历完所有层。在遍历每一层时,将该层的节点值加入结果数组的末尾。