当前位置: 首页 > news >正文

刷题日记---二叉树递归专题

文章目录

  • 1. 从根到叶的二进制数之和
  • 2. 二叉树的坡度
  • 3. 总结

1. 从根到叶的二进制数之和

描述:
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
返回这些数字之和。题目数据保证答案是一个 32 位 整数。

OJ链接

根结点到一个叶子结点为一条路径,有多少个叶子结点就有多少条路径,而此题要求的便是所有路径之和。

所以,二叉树的各个路径都必须遍历,所以需要递归二叉树,路径的遍历是向下的,因此是深度优先遍历,在遍历过程中,可以用一个变量累加每条路径之和。

具体代码如下:
class Solution {
public:
    int sum = 0;//用以记录路径之和
    void dfs(TreeNode* root,int val)
    {
        if(root == nullptr)//如果是空,直接返回
            return;
        val = val * 2 + root->val;
        if(root->left == nullptr && root->right == nullptr)//判断是否到路径末尾,即叶子结点处
        {
            sum += val;//此时的val,即一条路径上的二进制数之和
            return;
        }
        //没有到路径末尾,因此继续向下递归
        dfs(root->left,val);
        dfs(root->right,val);
    }
    int sumRootToLeaf(TreeNode* root) {
        dfs(root,0);
        return sum;  
    }
};

2. 二叉树的坡度

描述:
给你一个二叉树的根节点 root ,计算并返回 整个树 的坡度 。
一个树的 节点的坡度定义即为,该节点左子树的节点之和和右子树节点之和的差的绝对值。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
整个树的坡度就是其所有节点的坡度之和。

OJ链接

在这道题中,结点坡度的定义与树的坡度的定义,二者是不同的。结点的坡度是左子树结点之和和右子树结点之和的差的绝对值,所以此题实际上是计算二叉树结点之和的拓展。

具体思路如下:

  1. 整个树的坡度就是其所有结点坡度之和,因此给一个变量用以记录结点坡度之和。
  2. 结点坡度与左右子树的和有关,因此二叉树递归遍历的目的在于,得到子树的和。
具体代码如下:
class Solution {
public:
    int count = 0;//记录坡度之和
    int dfs(TreeNode* root)
    {
        if(root == nullptr)
            return 0;//空结点,无值,返回0
        int sumLeft = dfs(root->left);//左子树的和
        int sumRight = dfs(root->right);//右子树的和
        count += abs(sumLeft - sumRight);
        
        return root->val + sumLeft + sumRight;//返回树(子树)的所有结点之和
    }
    int findTilt(TreeNode* root) {
        dfs(root);
        return count;
    }
};

3. 总结

二叉树的递归,或者说递归的算法题,确实比较玄学,如果能厘清楚递归的整个过程,那就相对比较简单。

关键还是在于,要清楚递归要去做什么,是如何递归,递归遇到不同的情况,又该做怎样不同处理,然后再结合简单实例,具体分析递归的代码到底该如何写。

相关文章:

  • OpenEuler学习笔记(三十):在OpenEuler上搭建3D建模环境
  • Linux内核实时机制x - 中断响应测试 Cyclictest分析1
  • 平面与平面相交算法杂谈
  • kafka的架构和工作原理
  • 在Mac arm架构终端中运行 corepack enable yarn 命令,安装yarn
  • 25、深度学习-自学之路-卷积神经网络基于MNIST数据集的程序展示
  • 14.1 Auto-GPT 项目定位与价值解读:揭开自主智能体的神秘面纱
  • 商品按图搜索拍立淘API接口系列概述
  • matplotlib中pyplot的基本使用
  • jvm 线程监控调试
  • Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示
  • 理解 package.json :在基于 TypeScript 开发 Babylon.js 项目中的关键角色
  • DeepSeek底层揭秘——知识图谱与语料库的联邦学习架构
  • 今日AI和商界事件(2025-02-13)
  • 实现pytorch注意力机制-one demo
  • 业务干挂数据库,Oracle内存分配不足
  • css:position
  • K8s之存储卷
  • Prompt通用技巧
  • redis sentinel模式 与 redis 分片集群 配置
  • 建设网站搞网络营销的总结/搜索引擎优化有哪些要点
  • 长宁广州网站建设/网站制作和推广
  • 优定软件网站建设/windows优化
  • 淮安做网站 卓越凯欣/免费制作网站的软件
  • 浙江省建设安全协会网站/北京优化互联网公司
  • 怎么做代刷网网站app/百度推广最近怎么了