代码学习记录13

随想录日记part13

t i m e : time: time 2024.03.06



主要内容:今天的主要内容是二叉树的第二部分哦,主要有层序遍历;翻转二叉树;对称二叉树。



Topic1二叉树的层序遍历

题目: 给你二叉树的根节点 r o o t root root ,返回其节点值的层序遍历。 (即逐层地,从左到右访问所有节点)。

示例:
请添加图片描述
输入: r o o t = [ 3 , 9 , 20 , n u l l , n u l l , 15 , 7 ] root = [3,9,20,null,null,15,7] root=[3,9,20,null,null,15,7]
输出: [ [ 3 ] , [ 9 , 20 ] , [ 15 , 7 ] ] [[3],[9,20],[15,7]] [[3],[9,20],[15,7]]

**思路:**层序遍历是一层一层去遍历二叉树,符合先进先出的规则,即图论中的广度优先遍历思路,所以这道题目我们需要辅助的队列来实现层序遍历。其遍历的动画可以观看下面的动画:
请添加图片描述
下面给出两种层序遍历的写法:

class Solution {
    // 定义一个记录组后输出的数组
    public List<List<Integer>> resList = new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        //levelOrder_queue(root);
        levelOrder_queue_pro(root,0);
        return resList;
    }

    // 使用栈辅助进行层次遍历
    private void levelOrder_queue(TreeNode root) {
        if (root == null)
            return;
        // 创建辅助队列
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(root);
        while (!q.isEmpty()) {
            List<Integer> tem = new ArrayList<Integer>();
            int length = q.size();
            while (length > 0) {
                TreeNode t = q.poll();
                tem.add(t.val);
                if (t.left != null)
                    q.offer(t.left);
                if (t.right != null)
                    q.offer(t.right);
                length--;
            }
            resList.add(tem);
        }
    }

    //使用递归的方法
    private void levelOrder_queue_pro(TreeNode root,int deep){
        if(root==null) return;
        deep++;
        if(resList.size()<deep){
            //当层级增加时,list的Item也增加,利用list的索引值进行层级界定
            List<Integer> tem = new ArrayList<Integer>();
            resList.add(tem);
        }
        resList.get(deep-1).add(root.val);
        levelOrder_queue_pro(root.left,deep);
        levelOrder_queue_pro(root.right,deep);

    }
}

上面的两种写法务必要记住。



Topic2翻转二叉树

**题目:**给你一棵二叉树的根节点 r o o t root root ,翻转这棵二叉树,并返回其根节点。
示例:请添加图片描述
输入: r o o t = [ 4 , 2 , 7 , 1 , 3 , 6 , 9 ] root = [4,2,7,1,3,6,9] root=[4,2,7,1,3,6,9]
输出: [ 4 , 7 , 2 , 9 , 6 , 3 , 1 ] [4,7,2,9,6,3,1] [4,7,2,9,6,3,1]

**思路:**整个树的翻转主要有两种思路:

  • 递归
  • 迭代
  • 递归法:写好递归是要有三个关键点注意的:
    1.确定参数和返回值
TreeNode transTree(TreeNode root);

2.确定中止条件

 if(root==null)return null;

3.确定单层递归逻辑
我的代码是前序遍历,先反转左右子树,然后进行交换左右孩子节点

		TreeNode b=transTree(root.right);
        TreeNode a=transTree(root.left);
        tem.left=b;
        tem.right=a;

完整的 j a v a java java 代码如下:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        return transTree(root);
    }

    private TreeNode transTree(TreeNode root) {
        TreeNode tem = root;
        if (tem == null)
            return null;
        TreeNode b = transTree(root.right);
        TreeNode a = transTree(root.left);
        tem.left = b;
        tem.right = a;
        return root;
    }
}

  • 迭代法:能够使用递归的方法都能使用栈来实现:
    如下面代码实现:
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null)return root;
        //建立栈
        Stack<TreeNode> stack=new Stack<TreeNode>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tem=stack.pop();
            transpoint(tem);
            if(tem.right!=null)stack.push(tem.right);
            if(tem.left!=null)stack.push(tem.left);
        }
        return root;
    }

    private void transpoint(TreeNode root){
        if(root==null)return;
        else{
            TreeNode t=root.left;
            root.left=root.right;
            root.right=t;
        }
    }
}


Topic3对称二叉树

**题目:**给你一个二叉树的根节点 r o o t root root , 检查它是否轴对称。
示例:
请添加图片描述
输入: r o o t = [ 1 , 2 , 2 , 3 , 4 , 4 , 3 ] root = [1,2,2,3,4,4,3] root=[1,2,2,3,4,4,3]
输出: t r u e true true

思路:
后序遍历的递归法以及迭代法

递归法:

class Solution {// 递归法
    public boolean isSymmetric(TreeNode root) {
        if (root == null)
            return true;
        else
            return isSame(root.left, root.right);
    }

    private boolean isSame(TreeNode left, TreeNode right) {
        if (left == null && right != null)
            return false;
        else if (left != null && right == null)
            return false;
        else if (left == null && right == null)
            return true;
        else {
            boolean a = isSame(left.left, right.right);
            boolean b = isSame(left.right, right.left);
            return (a && b);
        }
    }
}

迭代法:
请添加图片描述
代码实现如下:

class Solution {// 使用队列辅助实现的迭代法
    public boolean isSymmetric(TreeNode root) {
        if (root == null)
            return true;
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offerFirst(root.left);// 将左子树头节点压入
        queue.offerLast(root.right);// 将右子树头节点压入
        while (!queue.isEmpty()) {
            TreeNode left = queue.pollFirst();
            TreeNode right = queue.pollLast();
            if (left == null && right == null)
                continue;
            if (left == null || right == null || left.val != right.val)
                return false;
            queue.offerFirst(left.left);
            queue.offerLast(right.right);
            queue.offerFirst(left.right);
            queue.offerLast(right.left);
        }
        return true;
    }
}
  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值