数据结构进阶 二叉树OJ题二

news2024/11/15 12:12:36

作者:@小萌新
专栏:@数据结构进阶
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:介绍几道二叉树的oj题

题目一 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

在这里插入图片描述
数据范围:输入二叉树的节点数 0 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0\le val \le 10000≤val≤1000
要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)

看到搜索二叉树的排序就应该能想到要中序遍历

因此我们首先要写一个中序遍历的子函数

    void Inorder(TreeNode*cur ,TreeNode*& prev)
	{
		if (cur == nullptr)
		{
			return;
		}
		
		Inorder(cur->left, prev);
		Inorder(cur->right, prev);
	}

然后因为题目中要求的连接操作

我们将左指针当作前驱指针 右指针都当作后继指针 就能写出下面的代码

    void Inorder(TreeNode*cur ,TreeNode*& prev)
	{
		if (cur == nullptr)
		{
			return;
		}
		
		Inorder(cur->left, prev);
		cur->left = prev;
		if (prev)
		{
			prev->right = cur;
		}

		prev = cur;
		Inorder(cur->right, prev);
	}

再之后我们就需要找到最小的一个节点 也就是最左边的节点

由于上面我们已经将整个二叉树变成了一个循环双向链表了

所以说我们这个时候设置一个指针 不停的往前找就能找到

当然这个时候也不能忽略本来二叉树就为空的情况

代码和运行结果如下

class Solution {
public:
    void Inorder(TreeNode*cur ,TreeNode*& prev)
	{
		if (cur == nullptr)
		{
			return;
		}
		
		Inorder(cur->left, prev);
		cur->left = prev;
		if (prev)
		{
			prev->right = cur;
		}

		prev = cur;
		Inorder(cur->right, prev);
	}
   
    TreeNode* Convert(TreeNode* pRootOfTree) 
	{

		if (pRootOfTree == nullptr)
		{
			return nullptr;
		}
        TreeNode* prev = nullptr;
	    Inorder(pRootOfTree, prev);

		TreeNode* cur = pRootOfTree;
		while (cur->left) {
			cur = cur->left;
		}

		return  cur;

    }
};

在这里插入图片描述

题目二 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal

在这里插入图片描述
首先 不管是前序遍历还是后续遍历我们都能够否很轻松的确定根所在的位置

在这里插入图片描述
之后我们通过根的位置还有中序遍历的特性遍能将二叉树分成三个部分

在这里插入图片描述

分成这三部分之后我们就可以很简单的使用递归来完成这颗二叉树了

        if (inbegin > inend)
        {
            return nullptr;
        }

        TreeNode* root = new TreeNode(preorder[prei]);
        int rooti = inbegin;
        while (rooti <= inend)
        {
            if (inorder[rooti] == preorder[prei])
            {
                break;
            }
            else
            {
                rooti++;
            }
        }

如果说左右区间 有一个为空 那么我们就不管了 返回一个空指针

如果不为空 我们找到根节点在哪里 之后递归左右节点

        root->left =  _buildtree(preorder, inorder, prei , inbegin , rooti -1 );
        root->right =  _buildtree(preorder, inorder, prei , rooti + 1 , inend);
        return root;

完整代码和运行结果如下

class Solution {
public:
    TreeNode* _buildtree(vector<int>& preorder, vector<int>& inorder, int& prei , int inbegin , int inend )
    {
        if (inbegin > inend)
        {
            return nullptr;
        }

        TreeNode* root = new TreeNode(preorder[prei]);
        int rooti = inbegin;
        while (rooti <= inend)
        {
            if (inorder[rooti] == preorder[prei])
            {
                break;
            }
            else
            {
                rooti++;
            }
        }

        prei++;
        root->left =  _buildtree(preorder, inorder, prei , inbegin , rooti -1 );
        root->right =  _buildtree(preorder, inorder, prei , rooti + 1 , inend);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    {
       int a = 0;
       return _buildtree(preorder, inorder, a, 0 , inorder.size()-1 );
    }
};

在这里插入图片描述

题目三 二叉树的非递归中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

一道很简单的题目 能A过这道题的代码应该是这么写的

class Solution {
public:
    vector<int> ans;
    vector<int> inorderTraversal(TreeNode* root) 
    {
        if (root == nullptr)
        {
            return ans;
        }   
         
        inorderTraversal(root -> left);
        ans.push_back(root -> val);
        inorderTraversal(root -> right);

        return ans;
    }
};

然后我们再这里再添加一个限制条件 不能使用递归

我们都知道 因为栈这种数据结构的存在

所有的递归都可以改写成非递归形式

对于二叉树这种数据结构来说也是一样子的

我们首先将二叉树的左子树全部入栈

之后开始取出左子树的节点记录 并且入栈右子树

代码表示如下

class Solution {
public:
    vector<int> ans;
    stack<TreeNode*> st1;
    vector<int> inorderTraversal(TreeNode* root) 
    {
        TreeNode* cur = root;
        while (cur || !st1.empty())
        {
        
        
            while (cur)
           {
            st1.push(cur);
            cur = cur -> left;
           }
        TreeNode* top = st1.top();
        st1.pop();
        ans.push_back(top -> val);


        // 右子树 
        cur = top -> right;
        }

        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

帆软—图表专题

饼图 优点&#xff1a;能很直观的看到每一个部分在整体中所占的比例。 缺点&#xff1a;不适合较大的数据集&#xff08;分类&#xff09;展现&#xff0c;数据项中不能有负值&#xff0c;当比例接近时&#xff0c;人眼很难准确判别。 变形饼图 柱形图 特点 优点&#xff…

SpringBoot HandlerMethodArgumentResolver接口自定义参数解析器

参考资料 【SpringBoot】HandlerMethodArgumentResolver的简单使用HandlerMethodArgumentResolver(参数解析器)的作用使用小案例HandlerMethodArgumentResolver用于统一获取当前登录用户 目录一. 需求二. 前期准备三. 实现HandlerMethodArgumentResolver接口四. 将自定义的方法…

一套javassf门户网站管理系统源码分享

淘源码&#xff1a;国内专业的免费源码下载平台 JAVA SSF项目框架源码 后台管理系统源码 一套以SpringMVCSpringHibernateFreemarkerShiroLuceneHtml5jQuery为技术核心架构的门户网站管理系统源码。 源码免费分享&#xff0c;需要源码学习可私信我。 主要功能&#xff1a; 内…

笑对过往、活在当下、期盼未来

哈喽大家好&#xff0c;我是阿Q。 去年今日&#xff0c;也是安静的午后&#xff0c;拿起铅笔在纸上寥寥草草的写下几个年终关键词&#xff0c;思索良久&#xff0c;迟迟未能下笔。 时至今日&#xff0c;年末将至&#xff0c;再次执笔已时隔一年&#xff0c;再不拿笔记录这转瞬…

Python制作粒子烟花,程序员的跨年姿势

跨年倒计时还有半天&#xff1f;我已经开始整烟花了&#xff0c;虽然不是很好看吧&#xff0c;但是也能将就看看 &#x1f625; 这个的背景图&#xff0c;音乐&#xff0c;还有文字都是可以自己修改的哦 效果展示 依次导入本次需要使用到的模块 import random import pygame…

免费的JPEG 恢复软件 - 照片删除了怎么恢复?

照片删除了怎么恢复? 照片在我们的生活中起着至关重要的作用&#xff0c;因为它们可以承载我们的快乐回忆&#xff0c;记录我们的日常生活&#xff0c;分享我们的快乐等。我们将在智能手机、相机或计算机上拍摄并存储大量 JPEG 图片。但是&#xff0c;无论我们多么小心地保留它…

Python和MySQL对比(2):用Pandas 实现MySQL的 union 和 join 语法效果

文章目录一、前言二、语法对比数据表unionjoin1、两表 inner join2、两表 left join3、两表 right join4、两表 outer join5、多表 join三、小结一、前言 环境&#xff1a; windows11 64位 Python3.9 MySQL8 pandas1.4.2 本文主要介绍 MySQL 中的union和join如何使用pandas实现…

Spring 核心概念 IOC/DI IOC容器 Bean

目录 一&#xff1a;代码书写现状 二&#xff1a;核心思想 一&#xff1a;代码书写现状 常规操作如上,但存在着问题,将项目上线后&#xff0c;需要将数据层进行更换,更换如下&#xff1a; 数据层更换后&#xff0c;业务层也需要进行更换&#xff0c;更换如下&#xff1a; 数据…

NLP学习笔记(五) 注意力机制

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲注意力机制 (Attention Mechanism) 在序列到序列模型中的应用 在上一篇文章中&#xff0c;我们介绍了序列到序列模型&#xff0c;其工作流程可以概括为以下两个步骤 首先&#xff0c;用编码器将输入序列编码成上下文向量&a…

费控产品之易快报洞察解析

1.费控行业洞察 1.1 概念及管理范畴界定 费控业务的本质是企业支出的管理&#xff0c;因此分析费控要从企业支出管理的宏观范畴来看&#xff0c;企业支出主要包括两方面&#xff0c;一个是企业成本&#xff0c;一个是期间费用。期间费用就是我们常说的管理费用、销售费用和财务…

Centos7的安装与模板机的制作

Centos7的安装与模板机的制作 1.安装环境准备 1.VMware Workstation 2.centos7镜像 本文用的VMware版本为16.2.1 build-18811642 2.开始安装 话不多说&#xff0c;直接上图 3.模板机制作 1.查看防火墙的运行状态 firewall-cmd --state防火墙目前正在启动中 2.关闭防火墙…

STM32——STM32简介与创建工程

文章目录一、stm32简介stm32MCU&#xff1a;ARM&#xff1a;命名规则&#xff1a;片上资源/外设&#xff1a;系统结构&#xff1a;引脚的定义功能引脚介绍&#xff1a;最小系统引脚介绍&#xff1a;电源引脚介绍&#xff1a;启动配置最小系统电路二、软件安装三、新建工程固件库…

2022年专业408的算法题

文章目录0 结果1 题目2 思路3 实现3.1 思路13.2 思路二0 结果 1 题目 2 思路 1&#xff0c;首先明确二叉搜索树的定义&#xff1a;任何一个节点大于其左子树中的全部结点&#xff0c;小于其右子树中的全部结点。中序遍历二叉搜索树得到一个升序序列。2&#xff0c;明确题目中给…

【微信小程序入门到精通】— 微信小程序实现多页面切换(tabBar)

目录前言一、tabBar 介绍二、实操&#xff08;创建 tabBar &#xff09;2.1 基本配置2.2 详细配置总结前言 对于目前形式&#xff0c;微信小程序是一个热门&#xff0c;那么我们该如何去学习并且掌握之后去做实际项目呢&#xff1f; 为此我特意开设此专栏&#xff0c;在我学习的…

mysql索引机制实现及自适应hash索引

一、介绍   哈希&#xff08;hash&#xff09;是一种非常快的查找方法&#xff0c;一般情况下查找的时间复杂度为O&#xff08;1&#xff09;。常用于连接&#xff08;join&#xff09;操作&#xff0c;如Oracle中的哈希连接&#xff08;hash join&#xff09;。 InnoDB存储…

canopen11-sdo-40读取命令

源码 参考文件 1、SDO介绍 就对象而言,主机要访问节点词典的数据,因此主机是client客户端,节点是server服务器。上传与下载是对服务器来说的(这点和常识有点不太一样)。因此,上传指的是服务器发送数据给客户端,下载是客户端给服务器数据。 我们这里要用主机访问节点服…

Linux多进程编程之exec函数族使用

Linux多进程编程之exec函数族使用1.exec函数族是什么2.execl函数具体使用3.execlp4.exec后面不同字母所代表的含义1.exec函数族是什么 顾名思义&#xff0c;它并不只是一个函数&#xff0c;而是以exec开头的六个函数&#xff0c;并且是没有exec这个函数的&#xff08;就像TCP/…

几行代码演示linux kernel、libc、userSpace app的关系

问一&#xff1a;编译出来的Linux内核镜像(".\build\arch\arm64\boot\Image")&#xff0c;可以单独运行吗&#xff1f;答案是能&#xff0c;但是加载完就提示panic&#xff0c;然后死掉了。 原因是&#xff1a; 内核代码加载完后&#xff0c;一定要切换到低权限模式…

Wireshark TS | Packet Challenge 之 HTTP 案例分析

前言 来自于 Sharkfest Packet Challenge 中的一个数据包案例&#xff0c;Sharkfest 是 Wireshark 官方组织的一年一度的大会&#xff0c;致力于在 Wireshark 开发人员和用户社区之间分享知识、经验和最佳实践。印象中早期是一年一次&#xff0c;近几年发展成一年两次&#xf…

我的2022年终总结

目录 1 序 1 2 工作 1 3 业余 1 3.1 AI 1 3.2 数学小插曲 3 3.3 金融投资 3 4 生活 4 5 最后 4 1 序 老婆大人每年这个时候都要写年终总结&#xff0c;现在也正在写&#xff1b;CSDN也发起了年终征文活动&#xff1b;各大app也各种年度大数据总结。我好像还是第一次写年终总…