首页 > 其他分享 >递归——二叉树中的深搜

递归——二叉树中的深搜

时间:2024-10-12 18:17:21浏览次数:3  
标签:right TreeNode val 递归 二叉树 root 节点 left

文章目录

二叉树中的深搜有三种方法

  • 前序遍历
    根->左子树->右子树

  • 中序遍历
    左子树->根->右子树

  • 前序遍历
    左子树->右子树->根

计算布尔二叉树的值

题目:计算布尔二叉树的值

在这里插入图片描述

思路

  • 如果当前节点node 为叶子节点,那么节点的值为它本身
  • 如果当前节点 node 含有孩子节点,对其孩子节点进行递归,计算出其左右孩子节点的值为;
    • 如果node == 2,返回两孩子节点的|运算结果;如果node == 3,返回两孩子节点的&运算结果;

因为是完全二叉树:每个节点有 0 个或者2 个孩子的二叉树。
所以对于递归出口,我们仅需判断当前节点的左孩子是否为空,如果为空,则当前节点为叶子节点;

C++代码

/**
 * 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:
    bool evaluateTree(TreeNode* root) 
    {
        if (root->left == nullptr) 
        {
            return root->val;
        } 

        if (root->val == 2) 
            return evaluateTree(root->left) || evaluateTree(root->right);
        else
            return evaluateTree(root->left) && evaluateTree(root->right);
    }
};

求根节点到叶节点数字之和

题目:求根节点到叶节点数字之和

在这里插入图片描述

思路

  • 从根节点开始,遍历每个节点,如果遇到叶子节点,则将叶子节点对应的数字加到数字之和。如果当前节点不是叶子节点,则计算其子节点对应的数字,然后对子节点递归遍历。

在这里插入图片描述

C++代码

/**
 * 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 dfs(TreeNode *root, int preSum)
    {
        preSum = preSum * 10 + root->val;
        if(root->left == nullptr && root->right == nullptr)
            return preSum;

        int res = 0;
        if(root->left) res += dfs(root->left, preSum);
        if(root->right) res += dfs(root->right, preSum);
        return res; 
    }
    int sumNumbers(TreeNode* root) 
    {
        return dfs(root, 0);
    }
};

二叉树剪枝

题目:二叉树剪枝

在这里插入图片描述
思路

返回移除了所有不包含 1的子树的原二叉树。
意思即,删除所有子树没有1的节点
我们要根据其左右子树的状态来判断当前节点能否删除,所有我们使用后序遍历

C++代码

/**
 * 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:
    TreeNode* pruneTree(TreeNode* root) 
    {
        if(!root)
        {
            return nullptr;
        }
        
        root->left = pruneTree(root->left);
        root->right = pruneTree(root->right);

        if(!root->left && !root->right && root->val == 0)
        {
            delete root;
            root = nullptr;
        }

        return root;
    }
};

验证二叉搜索树

题目:验证二叉搜索树

在这里插入图片描述
思路

二叉搜索树:左子树小于根节点;右子树大于根节点
我们知道,二叉搜索树的中序遍历结果是一个有序的数组,所以我们会有这样一个想法:对其进行中序遍历,并将每一个结果的值保存在一个数组中,最后判断该数组是否有序;

使用一个全局变量存储上一个用于对比的数值

C++代码

/**
 * 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 
{
    long prev = LONG_MIN;
public:
    bool isValidBST(TreeNode* root) 
    {
        if(!root) return true;

        if(!isValidBST(root->left)) return false;

        if (prev != LONG_MIN && (root->val <= prev)) 
            return false;
        prev = root->val;

        return isValidBST(root->right);
    }
};

二叉搜索树中第 K 小的元素

题目:二叉搜索树中第 K 小的元素

在这里插入图片描述

思路

两个全局变量 + 中序遍历

  • 一个来标记,次数count
  • 一个来标记,结果ret

C++代码

/**
 * 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 
{
    int count, ret;
    void dfs(TreeNode* root)
    {
        if(!root || !count) return ;

        dfs(root->left);
        
        if(!(--count)) ret = root->val;

        dfs(root->right);
    }
public:
    int kthSmallest(TreeNode* root, int k) 
    {
        count = k;
        dfs(root);
        return ret;
    }   
};

二叉树的所有路径

二叉树的所有路径

题目:二叉树的所有路径

在这里插入图片描述
思路

  • dfs函数中,首先将当前节点的值转换为字符串并添加到 path中。
  • 检查当前节点是否为叶子节点(即没有左子节点和右子节点)。如果是叶子节点,将 path 添加到结果数组 res 中,并返回。
  • 如果当前节点不是叶子节点,则继续递归搜索其左子节点和右子节点。
  • 在递归调用dfs时,对于非叶子节点,需要在path 后添加 ->符号

C++代码

/**
 * 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 
{
    void dfs(TreeNode* root, string path, vector<string>& res)
    {   
        path += to_string(root->val);
        if(root->left == nullptr && root->right == nullptr) // 叶子节点不添加 "->"
        {
            res.push_back(path);
            return;
        }

        if(root->left) dfs(root->left, path + "->", res);
        if(root->right) dfs(root->right, path + "->", res);

        return;   
    }

public:
    vector<string> binaryTreePaths(TreeNode* root) 
    {
        vector<string> res;
        string path;
        dfs(root, path, res);
        
        return res;
    }
};

标签:right,TreeNode,val,递归,二叉树,root,节点,left
From: https://blog.csdn.net/m0_74317866/article/details/142880990

相关文章

  • 二叉树(上)
    目录1.树型结构(了解)1.1树形结构概念1.2树概念(重要)​编辑1.3树的表示形式(了解)1.4树的应用​编辑2.二叉树(重点)2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的存储2.5二叉树的基本操作2.5.1前置说明1.树型结构(了解)1.1树形结构概念树......
  • 代码随想录算法训练营day12|144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉
    学习资料:https://programmercarl.com/二叉树理论基础.html二叉树:满二叉树、完全二叉树、二叉搜索数、平衡二叉搜索树;链式存储、顺序存储;前序/中序/后序遍历递归法、迭代法,层序深度优先搜索dfs,广度优先搜索学习记录:144.二叉树的前序遍历(也要注重二叉数的输入方式;递归法比迭......
  • 递归算法的时间复杂度(通过一道面试题来讲解)
    本篇通过一道简单的面试题,逐步分析递归算法的时间复杂度,最后找到最优解同一道题目,同样使用递归算法,既可以写出时间复杂度为O(n)的代码,也可以写出时间复杂度为O(logn)的代码。why?这是因为对递归算法的时间复杂度理解不够深入。下面通过一道面试题,来逐步分析递归算法的时间复......
  • 【hot100-java】二叉树的右视图
    二叉树篇tql /***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodeleft,Tre......
  • 刷题计划 day12 二叉树(一)【定义】【递归遍历】【迭代遍历】
    ⚡刷题计划day12 二叉树(一)继续,这一小节主要是基础知识,但同样也是十分重要的,可以点个免费的赞哦~往期可看专栏,关注不迷路,您的支持是我的最大动力......
  • 递归特征消除(RFE)与随机森林回归模型的 MATLAB 实现
    在机器学习中,特征选择是提高模型性能的重要步骤。本文将详细探讨使用递归特征消除(RFE)结合随机森林回归模型的实现,以研究对股票收盘价影响的特征。我们将逐步分析代码并介绍相关的数学原理。1.数据准备首先,我们清空工作区并加载数据,假设最后一列是股票的收盘价,前面的列是特征......
  • 链表【两数相加】具体思路——【递归】【迭代】【暴力】(附完整代码)
    文章目录前言一、问题引入,如何理解【链表】两数相加?二、方法一(固定数组暴力)三、方法二(递归法)四、方法三(迭代法)前言本文将介绍【链表】两数相加对于这一问题将采用多种思路方法来解决【暴力】【递归法】【迭代法】一、问题引入,如何理解【链表】两数相加?题目链接......
  • 快速排序的非递归实现:借助栈实现、借助队列实现
    目录用栈实现快速排序1.用栈实现非递归快速排序的思路步骤1.1.思路步骤2.用栈实现非递归快速排序的代码3.用栈实现非递归快速排序的整个工程3.1.QuickSortNonR.h3.2.QuickSortNonR.c3.3.Stack.h3.4.Stack.c用队列实现非递归快速排序1.用队列实现非递归快速排序的思......
  • 详解二叉树的非递归遍历
    二叉树的非递归遍历:二叉树的非递归遍历使用栈或队列自身功能(先进后出或先进先出)来实现。对于非常深的树,递归可能导致栈溢出错误,因为每次递归调用都会占用栈空间。非递归遍历使用显式的栈或队列,可以更好地控制内存使用,避免这种问题。链表节点:classTreeNode{intv......
  • 编写一个程序递归判断一个字符串是否为回文。回文是指从前往后读和从后往前读都一样的
    defis_string_palindrome(string):iflen(string)<2:#设置出口returnTrueelse:#判断首末位是否相同ifstring[0]==string[len(string)-1]:#用列表来删除首末位相同字符list1=list(string)list1.pop(0)list1.pop()string=''.join(list1)#设置过程returnis_str......