对称二叉树(101. 对称二叉树)

对称二叉树

101. 对称二叉树

递归法

递归法,写起来会相对简单一些。

  1. 确定递归函数的返回值和参数

    因为只需要判断是否对称即可,所以返回参数为布尔类型,形参为要比较的两个节点,left和right

    public boolean compare(TreeNode left, TreeNode right){...}

  2. 确定终止条件

    先来想一想在什么情况下,会返回false

    • left和right有一个为空,另一个不为空的时候

    • left和right都不为空,但是值不相等的时候

    什么时候会返回true

    • 当left和right均为空的时候

    if (left != null && right == null) return false;
    if (left == null && right != null) return false;
    if (left == null && right == null) return true;
    if (left.val != right.val) return false;
  3. 确定循环体

    分别找到外侧和内测,看看是否相等(用递归函数compare)

    外侧:boolean outside = compare(left.left, righ.right);

    内侧:boolean indise = compare(left.right, right.left);

    最后把内外侧结果做与运算,得到最终返回值

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) return true;
        return compare(root.left,root.right);
    }
    public boolean compare(TreeNode left, TreeNode right) {
        if (left != null && right == null) return false;
        if (left == null && right != null) return false;
        if (left == null && right == null) return true;
        if (left.val != right.val) return false;
        //递归
        boolean outside = compare(left.left, right.right);
        boolean inside = compare(left.right, right.left);
        return outside && inside;
    }
}

递归法

递归法理解起来相对来说比较费劲,是利用到了双端队列进行的结构

递归法从流程上来说,是先比较内侧节点,再往外延伸进行进一步的比较

我们直接先帖代码,根据代码来讲解

class Solution {
    public boolean isSymmetric(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offerFirst(root.left);
        deque.offerLast(root.right);
        while (!deque.isEmpty()) {
            TreeNode leftNode = deque.pollFirst();
            TreeNode rightNode = deque.pollLast();
            if (leftNode == null && rightNode == null) {
                continue;
            }
//            if (leftNode == null && rightNode != null) {
//                return false;
//            }
//            if (leftNode != null && rightNode == null) {
//                return false;
//            }
//            if (leftNode.val != rightNode.val) {
//                return false;
//            }
            // 以上三个判断条件合并
            if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) {
                return false;
            }
            deque.offerFirst(leftNode.left);
            deque.offerFirst(leftNode.right);
            deque.offerLast(rightNode.right);
            deque.offerLast(rightNode.left);
        }
        return true;
    }
}

此时我们定义一个二叉树,其中数据表示的是节点标号,不是节点存储的数值

  1. 刚开始的时候是2和3入队

    • que:2,3

    • 取出队列的头和尾,作为leftNode和rightNode

    • 经过条件语句判断

    • 入队

      deque.offerFirst(leftNode.left);
      deque.offerFirst(leftNode.right);
      deque.offerLast(rightNode.right);
      deque.offerLast(rightNode.left);

    此时的que:5,4,7,6

  2. 开始第二轮循环

    • 取出队列的头和尾

      leftNode = 5,rightNode = 6(比较的是内测的两个节点)

    • 经过条件语句判断

    • 入队

      deque.offerFirst(leftNode.left);
      deque.offerFirst(leftNode.right);
      deque.offerLast(rightNode.right);
      deque.offerLast(rightNode.left);

    此时的que:11,10,4,7,13,12

  3. 开始第三轮的循环

    • 取出队列的头和尾

      leftNode = 11,rightNode = 12(依旧是下一层最内侧的两个点)

    • 经过条件语句判断

    • 入队

    此时的que:10,4,7,13,12

  4. 此时的内侧的所有节点均比较完,开始比较剩余的其他相对内侧节点。开始第四轮循环。以此类推

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值