c++--二叉树应用

1.根据二叉树创建字符串  力扣

给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

来源:力扣(LeetCode)

class Solution {
public:
    string tree2str(TreeNode* root) 
    {
        //根据前序遍历确定字符串
        if(root==nullptr)
            return "";
        string tree=to_string(root->val);
        //只有左右子树都为空不保留括号,其他情况都保留括号
        if(root->left||root->right)
        {
            tree+='(';
            tree+=tree2str(root->left);
            tree+=')'; 
        }

         if(root->right)
        {
            tree+='(';
            tree+=tree2str(root->right);
            tree+=')'; 
        }
        return tree;
    }
};

2.二叉树分层遍历 力扣

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

来源:力扣(LeetCode)

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
        //用队列来确定
        queue<TreeNode*> TreeNode1;
        vector<vector<int>> vv;
        int levesize=0;
        if(root)
        {
            TreeNode1.push(root);
            levesize=1;
        }
        while(!TreeNode1.empty())
        {
            vector<int> v;
            for(int i=0;i<levesize;i++)
            {
                TreeNode* front= TreeNode1.front();
                TreeNode1.pop();

                v.push_back(front->val);

                if(front->left)
                { 
                    TreeNode1.push(front->left);
                }
                if(front->right)
                {
                    
                    TreeNode1.push(front->right);
                }
            }
            vv.push_back(v);
            //TreeNode.pop();
            levesize=TreeNode1.size();
        }
        return vv;

    }
};

3.二叉树的最近公共祖先 力扣

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

来源:力扣(LeetCode)

class Solution {
public:
    bool find_node(TreeNode* root, TreeNode* p, stack<TreeNode*>& path)
    {
        if(root==nullptr)
            return false;
       
        path.push(root);

        if (root == p)
            return true;
       if( find_node(root->left, p, path))
            return true;
        
       if( find_node(root->right, p, path))
            return true;
        path.pop();
        return false;
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
    {
         

         //使用两个栈存放二叉树要找的数据,
        stack<TreeNode*> ppath;
        stack<TreeNode*> qpath;
        find_node(root, p, ppath);
        find_node(root, q, qpath);
        //确定长度
        while (ppath.size() > qpath.size())
        {
            ppath.pop();
        }
        while (ppath.size() < qpath.size())
        {
            qpath.pop();
        }

        while (ppath.size() == qpath.size())
        {
            if (ppath.top() == qpath.top())
            {
                return ppath.top();
            }
            ppath.pop();
            qpath.pop();
        }
        return nullptr;

    }
};

4.  二叉搜索树与双向链表_牛客题霸_牛客网

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

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

注意:

1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构

4.你不用输出双向链表,程序会根据你的返回值自动打印输出

输入描述:

二叉树的根节点

返回值描述:

双向链表的其中一个头节点。

示例1

输入:

{10,6,14,4,8,12,16}
返回值:
From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;
class Solution {
	void Indor(TreeNode* cur,TreeNode*& prev)
	{
        //确定双向链表
		if(cur==nullptr)
			return;
		Indor(cur->left,prev);
		cur->left=prev;
		
		if(prev)
			prev->right=cur;
		prev=cur;
		Indor(cur->right,prev);
		
	}
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
	{
		TreeNode* prev=nullptr;
		Indor(pRootOfTree,prev);
        //判断头结点
		TreeNode* head=pRootOfTree;
		while(head&&head->left)
		{
			head=head->left;
		}
		return head;
    }
};

5.从前序与中序确定二叉树 力扣

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

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

来源:力扣(LeetCode)

class Solution {
    TreeNode* buildTree(vector<int>& preorder,vector<int>& inorder,int& prie,
                    int inbegin,int inend)
        {
            if(inbegin>inend)//结束条件
                return nullptr;

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

            root->left=buildTree(preorder,inorder,prie,inbegin,rooti-1);
            root->right=buildTree(preorder,inorder,prie,rooti+1,inend);

            return root;

        }

public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    {
        int i=0;
        TreeNode* root=buildTree(preorder,inorder,i,0,inorder.size()-1);
        return root;
    }
};

6.中序与后序确定二叉树  力扣

class Solution {
    TreeNode* _buildTree(vector<int>& inorder,vector<int>& postorder,
                        int& n,int inbegin,int inend)
    {
        if(inbegin>inend)
            return nullptr;

        TreeNode* root=new TreeNode(postorder[n]);

        int rooti=inbegin;

        while(rooti<=inend)
        {
            if(postorder[n]==inorder[rooti])
                break;
            rooti++;
        }
        n--;

        root->right=_buildTree(inorder,postorder,n,rooti+1,inend);//先右再左
        root->left=_buildTree(inorder,postorder,n,inbegin,rooti-1);
        return root;
    }
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) 
    {
        int n=postorder.size()-1;

        return _buildTree(inorder,postorder,n,0,postorder.size()-1);
    }
};

7.二叉树后序遍历迭代算法  力扣

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

示例 1:

输入:root = [1,null,2,3]
输出:[3,2,1]

来源:力扣(LeetCode)

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) 
    {
        stack<TreeNode*> st;
        vector<int> nums;
        TreeNode* cur=root;
        TreeNode* prev=nullptr;

        while(cur||!st.empty())
        {
            while(cur)
            {
                st.push(cur);
                cur=cur->left;
            }
            TreeNode* top=st.top();
            if(top->right==nullptr||top->right==prev)//防止重复遍历
            {
                prev=top;
                st.pop();
                nums.push_back(top->val);
            }
            else
            {
                cur=top->right;
            }
            
        }
        return nums;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

web题型

0X01 命令执行 漏洞原理 没有对用户输入的内容进行一定过滤直接传给shell_exec、system一类函数执行 看一个具体例子 cmd1|cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1;cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1&cmd2:无论cmd1是否执行成…

AI相机“妙鸭相机”原理分析和手动实现方案

妙鸭相机 一个通过上传大约20张照片&#xff0c;生成专属自拍。在2023年7月末爆火&#xff0c;根据36Kr报道&#xff0c;妙鸭相机系阿里系产品&#xff0c;挂靠在阿里大文娱体系下&#xff0c;并非独立公司。 使用方法是上传20张自拍照片&#xff0c;之后可以选择模板生成自己…

如何创建51单片机KEIL工程

如何创建51单片机KEIL工程步骤&#xff1a; &#xff08;1&#xff09;打开keil软件&#xff0c;点击工具栏-Project&#xff0c;选择创建新的工程&#xff1b; &#xff08;2&#xff09;然后给工程命名&#xff0c;文章以project为例&#xff0c;然后点击保存 &#xff08…

p7付费课程笔记6:CMS GC

目录 前言 工作步骤 缺点 问题 前言 上一章节我们讲了串/并行GC&#xff0c;这一章节说下CMS GC。看前思考一个问题&#xff0c;并行GC与CMS GC的区别在哪里。 什么是CMS收集器 CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于…

经典CNN(三):DenseNet算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 前言 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为最主流的方法&#xff0c;比如GoogleNet&#xff0c;…

替换开源LDAP,西井科技用宁盾目录统一身份,为业务敏捷提供支撑

客户介绍 上海西井科技股份有限公司成立于2015年&#xff0c;是一家深耕于大物流领域的人工智能公司&#xff0c;旗下无人驾驶卡车品牌Q-Truck开创了全球全时无人驾驶新能源商用车的先河&#xff0c;迄今为止已为全球16个国家和地区&#xff0c;120余家客户打造智能化升级体验…

前端构建(打包)工具发展史

大多同学的前端学习路线&#xff1a;三件套框架慢慢延伸到其他&#xff0c;在这个过程中&#xff0c;有一个词出现的频率很高&#xff1a;webpack 。 作为一个很出名的前端构建工具我们在网上随便一搜&#xff0c;就会有各种教程&#xff1a;loader plugin entry吧啦吧啦。 但…

【框架篇】Spring MVC 介绍及使用(详细教程)

Spring MVC 介绍 1&#xff0c;MVC 设计模式 MVC&#xff08;Model-View-Controller&#xff09;是一种常见的软件设计模式&#xff0c;用于将应用程序的逻辑分离成三个独立的组件&#xff1a; 模型&#xff08;Model&#xff09;&#xff1a;模型是应用程序的数据和业务逻辑…

C# Blazor 学习笔记(5):blazor文件夹组件引入

文章目录 前言文件夹组件引入文件夹分类文件引入解决方法 前言 为了更好的组件化管理整个文件&#xff0c;我选择使用分文件夹对项目组件进行分类。 文件夹组件引入 文件夹分类 Shared&#xff1a;Layout布局空间放置地方&#xff0c;由于默认创建&#xff0c;动也不好动&a…

Linux —— 进程控制

目录 一&#xff0c;进程创建 写时拷贝 二&#xff0c;进程终止 三&#xff0c;进程等待 获取子进程status 一&#xff0c;进程创建 命令行启动命令&#xff08;程序、指令等&#xff09;&#xff1b;通过程序自身fork创建&#xff1b; #include<unistd.h> //子进程…

【Git】保姆级详解:Git配置SSH Key(密钥和公钥)到github

博主简介&#xff1a;22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a;是瑶瑶子啦每日一言&#x1f33c;: “当人们做不到一些事情的时候&#xff0c;他们会对你说你也同样不能。”——《当幸福来敲门》 克里斯加德纳 Git配置SSH Key 一、什么是Git?二、什么…

Shader 编程:GLSL 重要的内置函数

该原创文章首发于微信公众号&#xff1a;字节流动 未经作者&#xff08;微信ID&#xff1a;Byte-Flow&#xff09;允许&#xff0c;禁止转载 前面发了一些关于 Shader 编程的文章&#xff0c;有读者反馈太碎片化了&#xff0c;希望这里能整理出来一个系列&#xff0c;方便系统的…

二叉树OJ(C)

文章目录 1.单值二叉树1.1法一&#xff1a;无返回值1.2法二&#xff1a;有返回值 2.相同的树3.对称二叉树4.二叉树的前序遍历5.二叉树的中序遍历6.二叉树的后序遍历7.另一棵树的子树8.二叉树遍历 1.单值二叉树 1.1法一&#xff1a;无返回值 struct TreeNode {int val;struct …

docker端口映射详解(随机端口、指定IP端口、随意ip指定端口、指定ip随机端口)

目录 docker端口映射详解 一、端口映射概述&#xff1a; 二、案例实验&#xff1a; 1、-P选项&#xff0c;随机端口 2、使用-p可以指定要映射到的本地端口。 Local_Port:Container_Port&#xff0c;任意地址的指定端口 Local_IP:Local_Port:Container_Port 映射到指定地…

Java设计模式之工厂设计模式

简介 工厂模式是一种常见的设计模式&#xff0c;用于创建对象的过程中&#xff0c;通过工厂类来封装对象的创建过程。其核心思想是将对象的创建和使用分离&#xff0c;从而降低耦合度&#xff0c;提高代码的可维护性和可扩展性。工厂模式通常包括三种类型&#xff1a;简单工厂…

探索国产嵌入式Python解决方案的方法(开源)

大家好&#xff0c;今天我们要介绍一款适用于单片机的嵌入式Python开源项目 -- PikaPython。 第一&#xff1a;嵌入式Python的发展趋势 在嵌入式领域软硬件的发展趋势中&#xff0c;硬件的成本日益降低&#xff0c;性能逐渐提升。这种趋势使得Python在芯片上的运行难度已经大大…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 4

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

物联网平台使用笔记

阿里云的IOT平台限制了50个设备。排除 移动云的限制较少&#xff0c;这里试用下。 创建完产品&#xff0c;接入设备后。使用MQTT客户端测试 其中client id 为设备id&#xff0c; username 为产品id&#xff0c; password 可以使用设备调试那里生成的。或使用官方token.exe 生成…

7.1.tensorRT高级(2)-使用openvino进行onnx的模型推理过程

目录 前言1. openvino2. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-使用 openvino 进行 onnx…

ChatGPT3.5——AI人工智能是个什么玩意?

ChatGPT3.5——AI人工智能 AI人工智能什么是AI&#xff1f;AI有什么过人之处AI有什么缺点 AI的发展AI的发展史中国是如何发展AI的 AI六大要素感知理解推理学习交互 ChatCPT-3.5GPT-3.5的优势在哪里GPT-3.5的风险GPT-4骗人事件 AI人工智能 AI&#xff0c;就像是一位超级聪明的机…