No101.对称二叉树
1.题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
2.算法思路
(1)递归思路
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。有三种情况。
- 左右子树都为空,真。
- 左右子树一空一非空,假。
- 左右子树都非空,此时需要判断左右子树的根节点值和左右子树是否对称
(2)迭代思路
可以利用队列进行迭代。队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像。
- 队列中首先包含的是 root 以及 root。
- 每次提取两个结点并比较它们的值。然后,将两个结点的左右子结点按相反的顺序插入队列中。
- 当队列为空时,或者检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。
即放入节点的顺序有规律
没两个节点从队列中拿出来进行比较。所以是leftNode.left和rightNode.right一组。leftNode.right和rightNode.left一组。一共两组。
3.算法代码
(1)递归思路
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true; //先判断树根节点是否为空
if(root.left == null && root.right == null) return true; //树根节点无子节点,真
if(root.left == null && root.right == null) return false; //树根节点只有一个子树,假
return isSame(root.left,root.right);
}
public static boolean isSame(TreeNode leftTree,TreeNode rightTree){
if(leftTree == null && rightTree == null) return true; //左右子树都为空,是对称的
if(leftTree == null || rightTree == null) return false; //上一行已经排除左右子树都是空的情况,所以这一行就一空一非空
//当前节点的值要相等,并且左子节点的左子树要和右子节点的右子树对称,左子节点的右子树要和右子节点的左子树对称
return (leftTree.val == rightTree.val) && isSame(leftTree.left,rightTree.right) && isSame(leftTree.right,rightTree.left);
}
}
(2)迭代思路
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true; //先判断树根节点是否为空
if(root.left == null && root.right == null) return true; //树根节点无子节点,真
if(root.left == null && root.right == null) return false; //树根节点只有一个子树,假
Queue<TreeNode> que = new LinkedList<>(); //此时,树根节点有左右子树
que.add(root.left);
que.add(root.right); //左右子节点入队列
while(que.size() != 0){
TreeNode leftNode = que.poll();
TreeNode rightNode = que.poll();
if(leftNode == null && rightNode == null) continue; //继续判断左右节点是否还有子节点
if(leftNode == null || rightNode == null) return false;
if(leftNode.val != rightNode.val)return false;
que.add(leftNode.left);
que.add(rightNode.right); //第一组要比较的两个节点(左左和右右)
que.add(leftNode.right);
que.add(rightNode.left); //第二组要比较的两个节点(左右和右左)
}
return true;
}
}
No104.二叉树的最大深度
1.题目
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明:
叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3
2.算法思路
采用递归的思想,找到当前节点左子树的深度和右子树的深度(前提是存在子树)。然后取二者的最大值即可。
3.算法代码
class Solution {
public int maxDepth(TreeNode root) {
if(root == null){ //若当前节点为空,那么显然子树深度为0
return 0;
}
int leftDepth = 0; //左子树深度
int rightDepth = 0; //右子树深度
if(root.left != null){
leftDepth += maxDepth(root.left);
}
if(root.right != null){
rightDepth += maxDepth(root.right);
}
return Math.max(leftDepth,rightDepth)+1;
}
}