代码随想录算法训练营第十五天|102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

代码随想录算法训练营第十五天|102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

102. 二叉树的层序遍历

题目链接

问题简述:对二叉树进行层次遍历,将每层节点val存入List,再将所有List存入一个List

思考:这个之前学数据结构学过,用到了队列。

算法思路:队列存入每层元素。不断将队头元素值存入List,再将队头的左右节点再次存入List,最后推出队头。此时队列中为下一层元素,不断循环,最后遍历完所有层元素。

import java.util.*;

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        ArrayDeque<TreeNode> dq = new ArrayDeque<>();
        List<List<Integer>> result = new ArrayList<>();
        //将跟结点存入栈
        if (root != null) dq.push(root);
        while (!dq.isEmpty()){
            //用于遍历当前层元素
            int a = dq.size();
            //用于储存当前层元素val
            List<Integer> level = new ArrayList<>();
            //将当前层元素存入,并添加下一层元素
            for (int i = 0; i < a; i++) {
                level.add(dq.peekFirst().val);
                if (dq.peekFirst().left != null) dq.add(dq.peekFirst().left);
                if (dq.peekFirst().right != null) dq.add(dq.peekFirst().right);
                dq.pop();
            }
            //加入当前层元素List
            result.add(level);
        }
        return result;
    }
}

226.翻转二叉树

题目链接

问题简述:将二叉树所有的左右节点翻转。

思考:这个之前学数据结构也学过,一定要后序遍历。

算法思路:后序遍历每个节点,交换每个节点的左右子树。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution {
    public TreeNode invertTree(TreeNode root) {
        invert(root);
        return root;
    }
		//还是先创建返回值为空的函数
    public void invert(TreeNode root) {
        //判断当前节点是否为空
        if (root == null) {
            return;
        }else {
            invert(root.left);
            invert(root.right);
          	//最后再处理当前节点
            TreeNode t = root.left;
            root.left = root.right;
            root.right = t;
        }
    }
}

101. 对称二叉树

题目链接

问题简述:判断两个二叉树是否对称。

思考:最开始想着可以对比左根右遍历和右根左遍历结果的List是否相同,后来发现不行,因为即使数字相同,数的结构可能也不同。

算法思路:将树的左右子树作为两个参数传入函数,如果当前左右结点不满足对称条件直接返回false,如果满足条件,那么继续递归判断左结点的左子树和右结点的右子树;左结点的右子树和右结点的左子树是否对称。

时间复杂度 O(n)

空间复杂度 O(1)

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left, root.right);
    }
    public boolean compare(TreeNode left, TreeNode right) {
      	//如果一个为空一个不为空直接返回false
        if (left == null && right != null) {
            return false;
        }
      	//如果一个为空一个不为空直接返回false
        if (left != null && right == null) {
            return false;
        }
      	//如果都为空返回true
        if (left == null && right == null) {
            return true;
        }
      	//如果不相等返回fasle
        if (left.val != right.val) {
            return false;
        }
      	//如果函数运行到这只能说明两个结点数值相等,那么继续判断左结点的左子树和右结点的右子树;左结点的右子树和右结点的左子树是否对称
        return compare(left.left, right.right) && compare(left.right, right.left);
    }
}

感想

每道题方法都很多,目前都只掌握了一种方法,第三个递归感觉稍微有点不好理解,但还是搞清楚了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值