首页 > 其他分享 >代码随想录|二叉树part 03

代码随想录|二叉树part 03

时间:2024-10-16 22:19:36浏览次数:9  
标签:03 return int 随想录 二叉树 root 节点 left

求普通二叉树的节点数量
要点:将子节点的个数记录到父节点,使用后序遍历
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==NULL)return 0;
        int left1=maxDepth(root->left);
        int right1=maxDepth(root->right);
        int num=1+left1+right1;
        return num;
    }
};


完全二叉树思路:

完全二叉树:除最后一层外,其他层都是满的,最后一层从左到右都是满的

先判断左右子树是否为满二叉树,通过求得满二叉树的深度,利用公式计算节点数,将节点数记录在父节点,若不是满二叉树,则继续遍历
此时父节点记录的为整个子树的节点个数
判断满二叉树:向左递归的深度与向右递归深度相等
,递归时仅左子树的左节点和右子树的右节点
递归终止条件:1、节点为空	2、遇见满二叉树,返回节点个数给父节点

2<<n :意味着当n=0时,2<<n=1,当n=1时,2<<n=2


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if(root==NULL)return 0;
        TreeNode *leftkey=root->left;
        TreeNode *rightkey=root->right;
        int leftnum=0,rightnum=0;
        while(leftkey)
        {
            leftkey=leftkey->left;
            leftnum++;
        }
        while(rightkey)
        {
            rightkey=rightkey->right;
            rightnum++;
        }
        if(leftnum==rightnum)//判断是否为满二叉树,递归返回条件之一
        {
            return (2<<rightnum)-1;
        }
        int left1=countNodes(root->left);
        int right1=countNodes(root->right);
        int num=left1+right1+1;//父节点记录该子树的全部节点数
        return num;
    }
};


平衡二叉搜索树(map\set\multiset\multimap)
任意节点左子树与右子树的高度差小于等于1

要点:
对左右子树分别统计其高度,计算高度差,判断是否符合平衡二叉树,符合返回最大高度,不符合返回-1

class Solution {
public:
    int getheight(TreeNode *root)
    {
        if(root==NULL)return 0;//结束条件
        int leftheight=getheight(root->left);//统计左方向子树高度,若符合平衡二叉返回最大高度,不符合,返回-1
        if(leftheight==-1)return -1;
        int rightheight=getheight(root->right);
        if(rightheight==-1)return -1;
        int height;
        if(abs(leftheight-rightheight)>1)height=-1;
        else{
            height=1+max(leftheight,rightheight);
        }
        return height;
    }
    bool isBalanced(TreeNode* root) {
        int height=getheight(root);
        if(height==-1)
        return false;
        else
        return true;
    }
};

要点:
利用前序遍历,用int数组记录单条路径
递归返回条件:遇到了叶子节点,将该路径记录,并返回
单层递归逻辑:1、将该节点的数值加入int数组
2、若左节点不为空,进入递归,递归结束后,弹出int数组的最后一个节点,即回溯到上一个节点,转为右节点进行递归
将int数组转为string:to_string(vector<int>),再将string加入数组

class Solution {
public:
    void getpath(TreeNode *root,vector<int>&path,vector<string>&res)
    {
        path.push_back(root->val);//中
        if(root->left==NULL&&root->right==NULL)
        {
            string s;
            for(int i=0;i<path.size()-1;i++)
            {
                s+=to_string(path[i]);
                s+="->";
            }
            s+=to_string(path[path.size()-1]);
            res.push_back(s);
            return;
        }
        if(root->left)
        {
            getpath(root->left,path,res);
            path.pop_back();//回溯,将该叶子节点弹出,回到父节点
        }
        if(root->right)
        {
            getpath(root->right,path,res);
            path.pop_back();
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int>path;
        vector<string>res;
        getpath(root,path,res);
        return res;
    }
};

所有父节点的左叶子之和
要点:
当此节点为叶子节点时,返回的值为0
此节点为父节点时,若他的左节点不为空且左节点的左右节点均为空,说明遇到了左叶子节点,记录下来

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root==NULL)return 0;
        if(root->left==NULL&&root->right==NULL)return 0;//叶子节点
        int leftsum=sumOfLeftLeaves(root->left);
        if(root->left!=NULL&&root->left->left==NULL&&root->left->right==NULL)//左叶子节点
        leftsum=root->left->val;
        int rightsum=sumOfLeftLeaves(root->right);
        return leftsum+rightsum;
    }
};

标签:03,return,int,随想录,二叉树,root,节点,left
From: https://blog.csdn.net/Carolinian/article/details/142993117

相关文章

  • 代码随想录|二叉树part 02
    翻转二叉树要点:指针交换优先利用前序或后序遍历,若采用中序遍历(则两次采用遍历左子树)classSolution{public:TreeNode*invertTree(TreeNode*root){if(root==NULL)returnroot;swap(root->left,root->right);invertTree(root->left);......
  • 2023年 10月自考《软件开发工具》03173试题
    目录一.单选题二.填空题三.简答题四.应用题一.单选题1.软件对可维护性、可重用性的要求越来越高,这是因为A.客观世界的复杂性B.软件的多样性C.客观世界的动态性D.软件的规模性2.时序网络用户描述 P58页A.数据内容B.程序执行的逻辑过程C.数据结果D.系统状态及......
  • 代码随想录算法训练营 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数
    300.最长递增子序列题目链接:300.最长递增子序列文档讲解︰代码随想录(programmercarl.com)视频讲解︰最长递增子序列日期:2024-10-16想法:dp[i]表示以nums[i]结尾的最长子数列长度,需要知道i之前的j的dp[j],找到最大的dp[j],再加1,初始化都为1。Java代码如下:classSolution{pub......
  • 代码随想录训练营第64天|bellman_ford
    47.参加科学大会#include<iostream>#include<vector>#include<list>#include<queue>#include<climits>usingnamespacestd;//小顶堆classmycomparison{public:booloperator()(constpair<int,int>&lhs,constpai......
  • 代码随想录训练营第58天|统计相邻
    110.字符串接龙#include<iostream>#include<vector>#include<string>#include<unordered_set>#include<unordered_map>#include<queue>usingnamespacestd;intmain(){stringbeginStr,endStr,str;intn;ci......
  • 嵌入式学习-IO进程-Day03
    嵌入式学习-IO进程-Day03IO进程获取文件属性(stat)库库的概念库的分类静态库的制作动态库的制作进程进程和程序的区别进程的特点进程三段进程的类型进程的运行状态进程状态转换图(重点)进程的函数接口创建进程forkfork函数创建的子进程的特点IO进程获取文件......
  • 2-STM32F103+ML307(中移4G Cat1)OTA升级篇(自建物联网平台)-STM32通过ML307使用http或
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/myota.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明前面......
  • 代码随想录算法训练营day17| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜
    学习资料:https://programmercarl.com/0654.最大二叉树.html#算法公开课用前序遍历构造二叉树二叉搜索树的特点,其左节点的值<每个节点的值<其右节点的值,且根节点的值大于它的左子树的所有节点的值,小于它右子树的所有节点的值,其他同理。二叉搜索树的搜索和验证时不关心遍历顺序,因......
  • Datawhale 组队学习 文生图 Prompt攻防 task03随笔
    这期我们从不同角度切入探讨赛题的进阶思路思路1:对比不同大模型首先我们可以选择尝试不同的大模型,使用更复杂的大模型可以提高文本改写的质量和效果。随着模型大小的增加,其表示能力也随之增强,能够捕捉更细微的语言特征和语义信息。这意味着大型模型在理解和生成文本时可以更......
  • P10353 [PA2024] Grupa permutacji 题解
    神秘!在这些排列生成的置换群\(G\)里,若\(\exists\pi\inG\)使得\(\pi_i=k,\pi_j=l\),则所有这些\((k,l)\)被同样数量的\(\pi\inG\)通过前述方法得出。证明:设\(\pi(i,j)=(k,l),\pi'(i,j)=(k',l')\)(意义前述),则\(\pi^{-1}\circ\pi'(k,l)=(k',l')......