Leetcoder Day12| 二叉树 part02

这篇具有很好参考价值的文章主要介绍了Leetcoder Day12| 二叉树 part02。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

语言:Java/C++ 

二叉树层序遍历 

给你一个二叉树,请你返回其按层序遍历得到的节点值。 (即逐层地,从左到右访问所有节点)。

Leetcoder Day12| 二叉树 part02,算法

在昨天的二叉树理论基础里有提到,层序遍历需要借助队列实现。队列先进先出,符合一层一层遍历的逻辑


class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result= new ArrayList<List<Integer>>();//存放结果
        //List<Integer> vec = new ArrayList<>(); 错误写法
        Queue<TreeNode> que= new LinkedList<TreeNode>();  //队列
        if (root == null) return result;
        que.offer(root);
        while(!que.isEmpty()){
            int len=que.size();
            List<Integer> vec = new ArrayList<>();
            while(len>0){
                TreeNode tmp=que.peek();
                que.poll();
                vec.add(tmp.val);
                if(tmp.left!=null) que.offer(tmp.left);
                if(tmp.right!=null) que.offer(tmp.right);
                len--;
            }
            result.add(vec);    
        }
        
        return result;


    }
}
这里要注意的是,定义每一层元素列表的时候List<Integer> vec = new ArrayList<>(),一定要放在循环内而不是定义在循环外,否则将会出现每一层结束后没有清空 vec 列表,导致 vec 列表一直保存了所有层的元素。错误如下:

Leetcoder Day12| 二叉树 part02,算法

递归写法:

class Solution {
    public List<List<Integer>> result = new ArrayList<List<Integer>>();
    public void order(TreeNode root, Integer depth){
        if(root==null) return;
        depth++;  //先进入到下一层好进行判断
        if(result.size()<depth){
            List<Integer> vec =new ArrayList<>();
            result.add(vec);
        }
        result.get(depth-1).add(root.val);
        order(root.left, depth);
        order(root.right, depth);
    }

    public List<List<Integer>> levelOrder(TreeNode root) {
        order(root, 0);
        return result;
    }
}

226.翻转二叉树 (优先掌握递归) 

翻转一棵二叉树。

Leetcoder Day12| 二叉树 part02,算法Leetcoder Day12| 二叉树 part02,算法

前序遍历的顺序是中左右,因此翻转二叉树可以延续前序遍历或后序遍历,只不过调整一下顺序即可。中序遍历不是很方便。

这里重点还是关注递归写法,考虑三要素:

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

参数就是要传入节点的指针,题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就函数的返回类型为TreeNode*

2. 确定终止条件

当前节点为空的时候,就返回

3. 确定单层递归的逻辑

按照中左右的顺序,先进行交换左右孩子节点,然后反转左子树,反转右子树。

class Solution {
    public void swap(TreeNode root){
        TreeNode tmp=root.left;
        root.left=root.right;
        root.right=tmp;

    }
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return null;
        swap(root);
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}

101. 对称二叉树 (优先掌握递归)  

给定一个二叉树,检查它是否是镜像对称的。

首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!

二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。

因此我们需要比较的是两个子树的里侧和外侧的元素是否相等。

Leetcoder Day12| 二叉树 part02,算法

本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。

正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。递归三要素判断如下:

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

因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。返回值自然是bool类型。

2. 确定终止条件

要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。

节点为空的情况有:(注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点

  • 左节点为空,右节点不为空,不对称,return false
  • 左不为空,右为空,不对称 return false
  • 左右都为空,对称,返回true

此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空:

  • 左右都不为空,比较节点数值,不相同就return false

此时左右节点不为空,且数值也不相同的情况我们也处理了。

3. 确定单层递归的逻辑

此时进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。文章来源地址https://www.toymoban.com/news/detail-808025.html

  • 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
  • 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
  • 如果左右都对称就返回true ,有一侧不对称就返回false 。
class Solution {
    public boolean compare(TreeNode left, TreeNode right){
        /*
        左节点为空,右节点不为空,不对称,return false
        左不为空,右为空,不对称 return false
        左右都为空,对称,返回true
        左右都不为空,比较节点数值,不相同就return false
         */
         if(left==null && right!=null) return false;
         else if(left!=null && right ==null) return false;
         else if(left==null && right==null) return true;
         else if(left.val!=right.val) return false;
         /*
        比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
        比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
        如果左右都对称就返回true ,有一侧不对称就返回false 。
*/
         else return compare(left.left, right.right) && compare(left.right, right.left);
    }
    public boolean isSymmetric(TreeNode root) {
        if(root==null) return true;
        return compare(root.left, root.right);
    }
}

到了这里,关于Leetcoder Day12| 二叉树 part02的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcoder Day39| 动态规划part06 完全背包问题

    有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 每件物品都有无限个(也就是可以放入背包多次) ,求解将哪些物品装入背包里物品价值总和最大。 示例: 背包最大重量为4。 物品为: 重量 价值 物品0 1 15 物品1 3 20 物品2 4 30 每

    2024年03月25日
    浏览(29)
  • Day28- 贪心算法part02

    题目一:122. 买卖股票的最佳时机II 122. 买卖股票的最佳时机 II 给你一个整数数组  prices  ,其中  prices[i]  表示某支股票第  i  天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候  最多  只能持有  一股  股票。你也可以先购买,然后在  同一天  

    2024年01月15日
    浏览(37)
  • Day32 贪心算法part02

    太牛了我,随随便便双指针秒杀 md题解里面双指针都没用直接for循环秒杀 写成这样纯粹是没有看到第一次跳跃必须从第一个开始

    2024年02月20日
    浏览(29)
  • 算法打卡|Day4 链表part02

    今日任务 ● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II 目录 Day4 链表part02 Problem: 24. 两两交换链表中的节点 思路 解题方法 Code Code Problem: 19. 删除链表的倒数第 N 个结点 思路 解题方法 Code Problem: 面试题 02.07. 链表相交

    2024年02月08日
    浏览(32)
  • 代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

    本文思路和详细讲解来自于:代码随想录 (programmercarl.com) 题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode) 本题使用队列辅助完成,讲解主要函数CheckOrder:首先判断root是否为空,是就直接返回,然后创建队列,向里加入root元素,计算队列的长度,也就是每一层的元素个数,while循环,si

    2024年02月06日
    浏览(33)
  • 贪心算法part6 | ● 738.单调递增的数字 ● 968.监控二叉树

    代码随想录算法训练营第一天 | 题目、题目 738.单调递增的数字 局部最优:前一个数比当前数小,前一个数位减一,当前数置为9 题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。 例如:98,一旦出现strNum[i - 1] strNum[i]的情况(非单调递增),首先想

    2024年02月10日
    浏览(29)
  • 算法刷题Day 15 二叉树的层序遍历+翻转二叉树+对称二叉树

    层序遍历二叉树需要借助到队列 递归方法 迭代方法 就是简单的用上前序遍历迭代方法实现,不用想的太复杂 递归方法 迭代方法 这里使用了队列来存放两个要比较的结点。也可以使用栈,方法是类似的。

    2024年02月12日
    浏览(30)
  • 算法训练day15Leetcode102二叉树层序遍历226翻转二叉树101对称二叉树

    https://www.bilibili.com/video/BV1ue4y1Y7Mf/?vd_source=8272bd48fee17396a4a1746c256ab0ae 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。 需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先

    2024年01月18日
    浏览(40)
  • 算法刷题Day 17 平衡二叉树+二叉树的所有路径+左叶子之和

    计算左右两棵子树的高度,如果有一个高度是-1(有一棵子树不平衡),直接返回-1,否则计算高度差,判断是否不平衡 使用 回溯 的方法,每次处理一个节点之前要把它push进table里,处理完之后又要把它pop出来 处理一个节点时,要判断它是否是左节点(需要父节点,可以通

    2024年02月15日
    浏览(31)
  • DAY41:贪心算法(十)监控二叉树

    给定一个二叉树,我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视 其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 输入:[0,0,null,0,0] 输出:1 解释:如图所示,一台摄像头足以监控所有节点。 输入:[0,0,null,0,null,0,null,null,

    2024年02月13日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包