首页 > 其他分享 >Day 15 二叉树part03

Day 15 二叉树part03

时间:2024-07-17 15:32:17浏览次数:17  
标签:right 15 part03 二叉树 path null root 节点 left

110. 平衡二叉树

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null) return true;
        return isBalanced(root.left) && isBalanced(root.right) 
            && Math.abs(hight(root.left) - hight(root.right)) <= 1;
    }

    public int hight(TreeNode root){
        if(root == null) return 0;
        return Math.max(hight(root.left), hight(root.right)) + 1;
    }
}

257. 二叉树的所有路径

这个题可以帮助理解112. 路径总和,做完这道再去做路经总和理解起来就会简单一些。

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> res = new ArrayList(); //存储所有的路径
        List<Integer> path = new ArrayList();  //存储当前路径上所有节点的val
        getPaths(res, root, path);
        return res;
    }

    public void getPaths(List<String> res, TreeNode cur, List<Integer> path){
        path.add(cur.val);  //将当前节点添加到路径中
        if(cur.left == null && cur.right == null) {  //如果当前节点是叶子节点,则把路径存储到res中
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < path.size() - 1; i++){
                sb.append(path.get(i)+"->");
            }
            sb.append(path.get(path.size()-1));
            res.add(sb.toString());return;
        }
        if(cur.left != null){   
            getPaths(res, cur.left, path);
            path.remove(path.size()-1);  //此时由于已经修改了path,cur.right需要使用修改前的path,因此进行回溯
        }
        if(cur.right != null){
            getPaths(res, cur.right, path);
            path.remove(path.size() - 1);  //同理,由于会修改path,因此在递归后需要进行对path回溯
        }
    }
}

404. 左叶子之和

这道题用递归做是比较容易的,具体看代码注释。

class Solution {
    int ans;
    public int sumOfLeftLeaves(TreeNode root) {
        ans = 0;
        sumLeft(root, root); //由于root一定不是左叶子节点,所以对于第二个参数,传入一个不是root节点父亲节点任意节点即可
        return ans;
    }
    public void sumLeft(TreeNode child, TreeNode parent){ 
        //sumLeft函数传入两个节点,分别对应当前节点和当前节点父亲节点,因此只需判断当前节点是父亲节点的左子节点且当前节点是叶子节点就把他的val加入结果汇总即可
        if(child == null) return;
        if(parent.left == child && child.left == null && child.right == null){
            ans += child.val;
        }
        sumLeft(child.left, child);
        sumLeft(child.right, child);
    }
}

222. 完全二叉树的节点个数

关于时间复杂度的计算可以看这篇题解。和前面大部分的题一样,想不到这个思路是真的做不出来。我想过有像哈夫曼树那样,但我自己写不出来,力扣的官解就是用了二分查找加位运算来做,我自己是实现不出来。

class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) return 0;
        int leftD = 0, rightD = 0;
        TreeNode left = root, right = root;
        while(left != null){
            leftD++;
            left = left.left;
        }
        while(right != null){
            rightD++;
            right = right.right;
        }
        if(leftD == rightD) return (1 << rightD) - 1;
        else return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

标签:right,15,part03,二叉树,path,null,root,节点,left
From: https://www.cnblogs.com/12sleep/p/18307512

相关文章

  • 代码随想录算法训练营第14天 | 复习二叉树翻转
    2024年7月17日递归法翻转二叉树易错:要考虑节点为空的情况,以及写好边界条件。/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.va......
  • 二叉树 部分定义与性质
    针对于知识回顾/复习,发现一些博客对于一些名词的定义各不相同,于是自己对于部分容易混淆的定义作一个简单的记录。详细关于二叉树的内容可以看:二叉树-Hello算法,部分博客内容来自其中。名词定义1.层层(Level):二叉树中的所有节点可以根据与根节点的距离分成不同的层次。根节点位......
  • 洛谷P1596 [USACO10OCT] Lake Counting S 题解
    看别的神犇用的都是并查集,我还是用暴搜吧(doge下面纯暴搜#include<bits/stdc++.h>usingnamespacestd;intn,m,ans;//N行M列和答案charc[105][105];//存储农田的二维向量voiddfs(intx,inty){//暴搜 if(c[x][y+1]=='W'){ c[x][y+1]='.';//将水坑改为......
  • iOS开发基础115-Socket
    在现代网络编程中,Socket(套接字)是实现网络通信的主要机制。Socket提供了端到端的双向通信接口,使得不同主机上的进程能够通过网络直接通信。在iOS开发中,经常需要使用Socket进行网络请求、实时通信(如聊天、游戏等)。以下将详细介绍Socket的概念,并列举iOS开发中常用的三方Socket框架,深......
  • 0基础学python-15:封装、继承和多态
    目录前言 一、封装(Encapsulation)私有变量: 二、继承(Inherit) 三、多态(Polymorphism)总结前言        封装、继承和多态是面向对象编程的三大基本特性,它们与面向对象编程(OOP)密切相关。  一、封装(Encapsulation)概念:封装指的是将数据(属性)和操作数据的方法......
  • LocalSend v1.15.0:一款免费的跨平台局域网文件传输工具
    今天电脑天空向大家介绍一款实用的开源跨平台局域网文件传输工具——LocalSendv1.15.0。这款工具能够帮助我们在不同的操作系统之间快速、安全地传输文件,非常适合开发者和IT专业人员使用。以下是LocalSend的详细介绍和使用指南。工具简介LocalSend是一款基于Web技术的文件......
  • 0715
    #SQL##CRUD操作CCreate增 RRead 查 UUpdata改 DDelete删##数据库对象表、视图、触发器、存储过程、函数##数据操作DML/DQLDataManiputlate/QueryLanguage###查询SELECT语句方言```sqlSELECT*FROMEmployee;--标准SQLSELEC......
  • LeetCode第257题:二叉树的所有路径的Java实现
    摘要LeetCode第257题要求生成二叉树的所有从根节点到叶子节点的路径。本文将介绍两种Java解决方案:迭代法和递归法。1.问题描述给定一个二叉树的根节点,按照从根到叶的顺序遍历所有路径,并将它们作为列表的列表返回。2.示例分析输入:[1,2,3,null,null,4]'输出:[[1,2],[1,......
  • 代码随想录刷题Day 14 二叉树part02
    226.翻转二叉树//这道题其实就是遍历二叉树,然后交换每个节点的左右子节点即可。这里我就使用了一个栈来存储需要遍历的节点,每次循环弹出一个,然后交换其左右子节点就好了classSolution{publicTreeNodeinvertTree(TreeNoderoot){Stack<TreeNode>stack=new......
  • 【Java--数据结构】二叉树
    欢迎关注个人主页:逸狼创造不易,可以点点赞吗~如有错误,欢迎指出~树结构树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合注意:树形结构中,子树之间不能有交集,否则就不是树形结构常见概念  节点的度:一个节点含有子树的个数,如A的度为6......