首页 > 其他分享 >二叉树深搜专题篇

二叉树深搜专题篇

时间:2024-09-30 12:19:00浏览次数:6  
标签:专题 return right 二叉树 root 节点 left

目录

计算布尔二叉树的值

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

二叉树剪枝

验证二叉搜索树

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

二叉树的所有路径


计算布尔二叉树的值

题目

思路

这道题其实是比较简单的,对二叉树来一次后序遍历即可,当遇到叶子结点直接返回叶子节点中的bool值即可,否则继续进行后序遍历,返回得到的左子树和右子树的计算结果。

代码

class Solution {
public:
    bool evaluateTree(TreeNode* root) {
        if(root->left==nullptr) return root->val==0?false:true;
        bool left=evaluateTree(root->left);
        bool right=evaluateTree(root->right);
        return root->val==2?left|right:left&right;
    }
};
求根节点到叶节点数字之和

题目

思路

这道题所说的求根节点到叶节点数字之和,并非是求根节点到叶节点所有数字直接相加起来,而是将从根节点到叶节点路径上前一个位置的数字乘10+该位置的值,然后将所有从根节点到叶节点所有路径上的和相加起来。

直接来一次DFS即可,如果当前节点没有左孩子和右孩子,说明当前节点是叶节点,直接返回前一个位置的数字乘10+该位置的值即可,否则,DFS计算该节点左孩子那一侧得到的路径值以及该节点右孩子那一侧得到的路径值,然后返回二者之和即可。

代码

class Solution {
public:
    int sumNumbers(TreeNode* root) {
        return dfs(root,0);
    }

    int dfs(TreeNode* root,int val){
        val=val*10+root->val;
        if(root->left==nullptr &&root->right==nullptr)
            return val;
        int ret=0;
        if(root->left) ret+=dfs(root->left,val);
        if(root->right) ret+=dfs(root->right,val);
        return ret;
    }
};
二叉树剪枝

题目

思路

题目中的描述“返回溢出所有不包含1的子树的原二叉树”,意思是剪掉不包含1的二叉树,如何判定某个位置是否应该被剪掉,来一次后序遍历即可,即先判断该位置左子树是否不包含1,以及该位置右子树是否不包含1,如果该位置左右子树都不包含1且该位置的值是0,那么就剪掉以该位置为根节点的子树,当遇到节点值是空时,直接返回空即可。

代码

class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        if(root==nullptr) return nullptr;
        root->left=pruneTree(root->left);
        root->right=pruneTree(root->right);
        if(root->left==nullptr && root->right==nullptr && root->val==0)
            root=nullptr;
        return root;
    }
};
验证二叉搜索树

题目

思路

我们可能会想到对二叉树来一次中序遍历,将中序遍历的结果存放到一个数组中,然后判断数组是否是升序的,因为对二叉搜索树进行中序遍历得到的结果是升序的,但是这样有些浪费空间,我们可以对二叉树进行中序遍历,使用一个变量prev记录中序遍历的前一个位置的值,每次到一个非空节点,判断该节点是否大于中序遍历前一个位置的值,如果大于,继续进行中序遍历,并更新prev的值为当前位置的值;否则直接返回false。其中prev事先初始化为LONG_MIN,因为这道题的节点值可能是INT_MIN。如果当前位置,当前位置的左子树,当前位置的右子树符合二叉搜索树的特点,返回true。

代码

class Solution {
    long prev=LONG_MIN;
public:
    bool isValidBST(TreeNode* root) {
        if(root==nullptr) return true;
        bool left=isValidBST(root->left);
        //剪枝
        if(left==false) return false;

        bool cur=false;
        if(root->val > prev)
            cur=true;
        //剪枝
        if(cur==false) return false;

        prev=root->val;
        bool right=isValidBST(root->right);
        return left && cur && right;
    }
};
二叉搜索树中第K小的元素

题目

思路

我们可能会想到遍历二叉搜索树,然后将所有节点的值添加到优先级队列中,然后就能够找到二叉搜索树中第K小的元素了,但是这样有些麻烦,不妨利用二叉搜索树的性质,对二叉树进行中序遍历,使用一个变量来记录当前位置是位于中序遍历的第几个位置,当正好是中序遍历的第K的位置,那么该位置的值就是二叉搜索树中第K小的元素。

代码

class Solution {
    int count,ret;
public:
    int kthSmallest(TreeNode* root, int k) {
        count=k;
        dfs(root);
        return ret;
    }

    void dfs(TreeNode* root){
        if(root==nullptr || count==0) return;
        dfs(root->left);
        count--;
        if(count==0) ret=root->val;
        dfs(root->right);
    }
};
二叉树的所有路径

题目

思路

这道题还是比较简单的,对二叉树进行一次DFS即可,当处理到叶节点的时候,直接返回得到的路径;否则,递归处理该位置左子树的路径以及该位置右子树的路径。

代码

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

    void dfs(TreeNode* root,string path){
        path+=to_string(root->val);
        if(root->left==nullptr && root->right==nullptr){
            ret.push_back(path);
            return;
        }
        path+="->";
        if(root->left) dfs(root->left,path);
        if(root->right) dfs(root->right,path);
    }
};

标签:专题,return,right,二叉树,root,节点,left
From: https://blog.csdn.net/wmh_1234567/article/details/140604986

相关文章

  • CMSIS-RTOS V2封装层专题视频,一期视频将常用配置和用法梳理清楚,适用于RTX5和FreeRTOS(2
    【前言】本期视频就一个任务,通过ARM官方的CMSISRTOS文档,将常用配置和用法给大家梳理清楚。对于初次使用CMSIS-RTOS的用户来说,通过梳理官方文档,可以系统的了解各种用法,方便大家再进一步的自学或者应用,起到授人以渔的作用。更深入的可以看之前分享的RTOS运行机制,任务管理,上下......
  • 二叉树高频题(上)
    二叉树高频题(上)102.二叉树的层序遍历#include<vector>#include<iostream>#include<algorithm>#include<queue>usingnamespacestd;structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode():val(0),left(nullp......
  • AVL树(平衡二叉树)的介绍以及相关构建
    欢迎光临:      羑悻的小杀马特-CSDN博客目录一·AVL树的介绍:二·AVL树的实现:1·结构框架:2·节点的插入: 旋转: 2·1左单旋:2.1.1左单旋介绍及步骤:2.1.2左单旋代码实现:2.1.3左单旋技巧总结: 2·2右单旋:2.2.1右单旋介绍及步骤:2.2.2右单旋代码实现:2.......
  • 代码随想录算法训练营Day16 | 513.找树左下角的值、112.路径总和、113.路径总和Ⅱ、10
    目录513.找树左下角的值112.路径总和113.路径总和Ⅱ106.从中序与后序遍历序列构造二叉树105.从前序与中序遍历序列构造二叉树513.找树左下角的值题目513.找树左下角的值-力扣(LeetCode)给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。假......
  • 12、二叉树
    1、二叉树的定义和初始化//二叉树节点定义typedefstructBinTreeNode{ElemTypedata;structBinTreeNode*leftChild;structBinTreeNode*rightChild;}BinTreeNode;//二叉树定义typedefstructBinTree{BinTreeNode*root;ElemTyperefvalue......
  • 13、线索二叉树
    1、线索化二叉树的定义和初始化#include<stdio.h>#include<malloc.h>#include<assert.h>#defineElemTypechartypedefstructBinTreeNode{ElemTypedata;structBinTreeNode*leftChild;structBinTreeNode*rightChild;intlTage;//左标记[0:......
  • 【专题】新能源发电行业及其市场化进程概览白皮书报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=37802随着中国经济结构的持续优化以及能源政策的不断进步,我国的能源消费呈现出稳定增长的态势。与此同时,能源利用效率逐步提高,清洁能源在能源结构中的比例也在稳步上升,这为国家的可持续发展战略提供了有力的支撑。文末204份电力行业研究报告最新趋......
  • 【算法】二叉树中的 DFS
     【ps】本篇有6 道 leetcode OJ。 目录一、算法简介二、相关例题1)计算布尔二叉树的值.1-题目解析.2-代码编写2)求根节点到叶节点数字之和.1-题目解析.2-代码编写3)二叉树剪枝.1-题目解析.2-代码编写4)验证二叉搜索树.1-题目解析.2-代码编写5)二叉......
  • (40)时钟专题--->(040)IBUF + BUFG
    1.1.1本节目录1)本节目录2)本节引言3)FPGA简介4)IBUF+BUFG5)结束语1.1.2本节引言“不积跬步,无以至千里;不积小流,无以成江海。就是说:不积累一步半步的行程,就没有办法达到千里之远;不积累细小的流水,就没有办法汇成江河大海。1.1.3FPGA简介FPGA(FieldProgrammableGateArr......
  • 美团一面:给定两棵二叉树 `A` 和 `B`,判断 `B` 是否是 `A` 的子结构?
    目录标题问题描述思路分析代码解释详细步骤复杂度分析问题描述给定两棵二叉树A和B,判断B是否是A的子结构。所谓子结构是指B中任意节点在A中存在相同的结构和节点值。例子1:输入:tree1=[1,7,5],tree2=[6,1]输出:false解释:tree2与tree1的一个子树......