leetcode刷题笔记(简单篇):101&104

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)递归思路
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。有三种情况。

  1. 左右子树都为空,真。
  2. 左右子树一空一非空,假。
  3. 左右子树都非空,此时需要判断左右子树的根节点值和左右子树是否对称

(2)迭代思路
可以利用队列进行迭代。队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像。

  1. 队列中首先包含的是 root 以及 root。
  2. 每次提取两个结点并比较它们的值。然后,将两个结点的左右子结点按相反的顺序插入队列中。
  3. 当队列为空时,或者检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

即放入节点的顺序有规律
没两个节点从队列中拿出来进行比较。所以是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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值