代码随想录算法训练营第十四天|● 226.翻转二叉树 ● 101.对称二叉树 2

226 反转二叉树

看完题后的思路

  1. 递归参数 根节点
  2. 终止条件 root==null
  3. 递归
    root.left=right;
    root.right=left;

思路

如上

代码

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {
   public TreeNode invertTree(TreeNode root) {
       invertTree02(root);
       return root;
   }
     public void invertTree02(TreeNode root) {
       if (root==null){
           return ;
       }
       TreeNode left = root.left;
       root.left=root.right;
       root.right=left;
       invertTree02(root.left);
       invertTree02(root.right);
   }
}

复杂度

在这里插入图片描述
为什么使用中序遍历不行?
在这里插入图片描述

看完题解后的收获

迭代法

 public TreeNode invertTree(TreeNode root) {
        if (root==null){
            return root;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode pop = stack.pop();
            if (pop!=null){
                if (pop.left!=null){
                    stack.push(pop.left);
                }
                if (pop.right!=null){
                    stack.push(pop.right);
                }
                stack.push(pop);
                stack.push(null);
            }else {
                TreeNode pop1 = stack.pop();
                TreeNode left = pop1.left;
                pop1.left=pop1.right;
                pop1.right=left;
            }
        }
        return root;
    }

在这里插入图片描述
三刷大脑敲出来或再敲一遍

101.对称二叉树 2

看完题后的思路

在这里插入图片描述

  1. 递归参数与返回值 bool f(tree1,tree2)
  2. 递归出口
    1. 两棵树有一棵树为空
    2. 两棵树根节点值不相等
    3. 外侧两颗树返回值为false 内侧为false
  3. 递归
    判断条件
    a=f(外侧);
    if(a==false) return false;
    b=f(内侧);
    return b;

思路

见上文

代码

 //101. 对称二叉树
    public boolean isSymmetric(TreeNode root) {
        if (root==null){
            return true;
        }
        return isSymmetricDG(root.left,root.right);
    }
    public boolean isSymmetricDG(TreeNode root1,TreeNode root2) {
        if (root1==null&&root2==null){
            return true;
        }else if (root1!=null&&root2!=null){
            if (root1.val!=root2.val){
                return false;
            }
            // 此时两根值相等
            boolean a = isSymmetricDG(root1.left, root2.right);
            if (a==false){
                return false;
            }
            boolean b = isSymmetricDG(root1.right, root2.left);
            return b;
        }else {// 只有一个为空
            return false;
        }
    }

复杂度

在这里插入图片描述

看完答案的收获

迭代法
在这里插入图片描述

  public boolean isSymmetric(TreeNode root) {
        if (root==null){
            return true;
        }
       // 普通队列 可以存空值
       Queue<TreeNode> deque = new LinkedList<>();
        deque.offer(root.left);
        deque.offer(root.right);
        while (!deque.isEmpty()){
            TreeNode poll01 = deque.poll();
            TreeNode poll02 = deque.poll();
            // 判断
            if (poll01==poll02){
               continue;
            }
            // 妙 层层递进的判断
            if (poll01==null||poll02==null||poll01.val!=poll02.val){
                return false;
            }
            // 入队
            deque.offer(poll01.left);
            deque.offer(poll02.right);
            deque.offer(poll01.right);
            deque.offer(poll02.left);
        }
        return true;
    }

在这里插入图片描述
判断一个为空的代码

       if (poll01==poll02){//全为空
                return true;
            }
            // 妙 层层递进的判断
            if (poll01==null||poll02==null||poll01.val!=poll02.val){
                return false;
            }

三刷大脑敲出来或再敲一遍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弈师亦友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值