IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 6.LeetCode刷题day06(二叉树的递归套路) -> 正文阅读

[数据结构与算法]6.LeetCode刷题day06(二叉树的递归套路)

LeetCode刷题day06(二叉树递归套路)

二叉树的递归套路就是,二叉树的左子树和右子树给结点某些信息,这个结点利用这些信息让整棵树满足题目要求。

1.题目1:将二叉树转换成双向链表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XyGH3Wae-1652774617912)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1652751128779.png)]

【思路】二叉树递归套路。每个结点的左右子树分别给这个结点已经链接好的双向链表结构的头和尾结点,然后和这个结点双向链接即可。

【代码】

//搜索二叉树转换成双向链表后,头和尾返回
class Info {
    public:
    Info(Node* start, Node* end) : start(start), end(end) {}
    Node* start = nullptr;
    Node* end = nullptr;
};
//以x为头的整棵搜索二叉树,用有序双向链表方式,连好并且返回,整个有序双向链表的
//头节点和尾结点
Info* process(Node* x) {
    if (x == nullptr) {
        return new Info(nullptr, nullptr);
    }
    Info* leftHeadEnd = process(x->left);
    Info* rightHeadEnd = process(x->right);
    if (leftHeadEnd->end != nullptr) {
        leftHeadEnd->end->right = x;
    }
    x->left = leftHeadEnd->end;
    x->right = rightHeadEnd->start;
    if (rightHeadEnd->start != nullptr) {
        rightHeadEnd->start->left = x;
    }
    return  new Info(leftHeadEnd->start != nullptr ? leftHeadEnd->start : x, rightHeadEnd->end != nullptr ? rightHeadEnd->end : x);
}

2.题目2:返回最大二叉搜索子树结点个数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-riREEf9y-1652774617913)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1652753020951.png)]

【思路】二叉搜索树递归套路。每个结点的左右子树返回左右子树最大二叉搜索子树的的最大结点个数。

【代码】

//返回类型
class Info {
public:
    Info() = default;
    Info(bool is, int minV, int maxV, int size) : 
    	isBst(is), minVal(minV), 
    	maxVal(maxV), maxBstSize(size) {}
    bool isBst = true; //子树是否是二叉搜索树
    int minVal = INT32_MAX; //最大搜索子树最小值
    int maxVal = INT32_MIN; //最大搜索子数最大值
    int maxBstSize = 0; //最大搜索子树结点个数
};
Info* process(Node *root) {
    if (root == nullptr) {
        return nullptr;
    }
    Info* leftInfo = process(root->left);
    Info* rightInfo = process(root->right);
    //初始化当前节点返回值
    bool isBst = true;
    int minVal = root->val;
    int maxVal = root->val;
    int maxBstSize = 1;
    //1.情况1:左右子树都为空
    if (!leftInfo && !rightInfo) {
        return new Info(isBst, minVal, maxVal, maxBstSize);
    }
    //2.情况2:左右子树不全为空,且子树本身不是二叉搜索树
    if (leftInfo && !rightInfo->isBst || 
        rightInfo && !leftInfo->isBst ||
       	!leftInfo->isBst && !rightInfo->isBst) {
        int leftSize = leftInfo == nullptr ? 0 : leftInfo->maxBstSize;
        int rightSize = rightInfo == nullptr ? 0 : rightInfo->maxBstSize;
        maxBstSize = max(leftSize, rightSize);
        return new Info(false, minVal, maxVal, maxBstSize);
    }
    //3.情况3:整棵树是二叉搜索树
    if (!leftInfo && rightInfo->isBst ||
        !rightInfo && leftInfo->isBst ||
       leftInfo->isBst && rightInfo->isBst) {
        int leftVal = leftInfo == nullptr ? INT32_MIN : leftInfo->maxVal;
        int rightVal = rightInfo == nullptr ? INT32_MAX : rightInfo->minVal;
        if (leftVal < root->val && root->val < rightVal) {
            minVal = leftInfo == nullptr ? root->val : leftInfo->minVal;
            maxVal = rightInfo == nullptr ? root->val : rightInfo->maxVal;
            int leftSize = (leftInfo == nullptr ? 0 : leftInfo->maxBstSize);
            int rightSize = (rightInfo == nullptr ? 0 :rightInfo->maxBstSize);
            maxBstSize = 1 + leftSize + rightSize;
            return new Info(true, minVal, maxVal, maxBstSize);
        } else {
            int leftSize = leftInfo == nullptr ? 0 : leftInfo->maxBstSize;
            int rightSize = rightInfo == nullptr ? 0 : rightInfo->maxBstSize;
            maxBstSize = max(leftSize, rightSize);
            return new Info(false, minVal, maxVal, maxBstSize);
        }
    }
}

3.题目3:二叉树的深度

剑指 Offer 55 - I. 二叉树的深度

难度简单187

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

例如:

给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

【思路】上题太复杂,来一个简单的二叉树递归套路。左树右子树分别给了左右子树最大深度的信息,这个结点的最大深度就是左右深度中大的那个加1。

【代码】

int maxDepth(TreeNode* root) {
    if (root == nullptr) {
        return 0;
    }
    int leftDepth = maxDepth(root->left);
    int rightDepth = maxDepth(root->right);
    return 1 + max(leftDepth, rightDepth);
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 19:13:41  更:2022-05-21 19:14:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:56:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码