《二叉搜索树OJ》

2023-10-28

文章目录


1、 根据二叉树创建字符串

在这里插入图片描述

思路图解:
在这里插入图片描述

//对于根节点,直接省略
//递归左边:
//1、左为空,右不为空不省略
//2、左不为空,不省略

//递归右边
//3、右不为空不能省略
    string tree2str(TreeNode* root) 
    {
        if(root == nullptr)
            return "";
        string str = to_string(root->val);
        if(root->left || root->right)
        {
            str += '(';
            str += tree2str(root->left);
            str += ')'; 
        }
        if(root->right)
        {
            str += '(';
            str += tree2str(root->right);
            str += ')';
        }
        return str;
    }

2、 二叉树的层序遍历

在这里插入图片描述

在这里插入图片描述

vector<vector<int>> levelOrder(TreeNode* root)
    {
        vector<vector<int>> vv;
        if(root == nullptr)
            return vv;
        queue<TreeNode*> Qdata; //存储数据的队列

        Qdata.push(root);
        int levelSize = 1;
        while(!Qdata.empty())
        { 
            vector<int> v;
            while(levelSize--)
            {
                 TreeNode* front = Qdata.front();
                 Qdata.pop();
                 v.push_back(front->val);

                 if(front->left)
                    Qdata.push(front->left);
                 if(front->right)
                    Qdata.push(front->right);
            }
            vv.push_back(v);
            levelSize = Qdata.size();
        }
        return vv;
    }

3、 二叉树的层序遍历 II

在这里插入图片描述
思路:直接将从头层序遍历的结果倒过来即可

vector<vector<int>> levelOrderBottom(TreeNode* root) 
    {
        vector<vector<int>> vv;
        queue<TreeNode*> q1; //节点
        int levelSize = 0;

        if(root != nullptr)
        {
            q1.push(root);
            levelSize = 1;
            
        }
        while(!q1.empty())
        {
            vector<int> v;
            while(levelSize--)
            {
                TreeNode* front = q1.front();
                q1.pop();

                
                v.push_back(front->val);

                if(front->left)
                    q1.push(front->left);
                if(front->right)
                    q1.push(front->right);
            }
            levelSize = q1.size();
            vv.push_back(v);
        }
        reverse(vv.begin(),vv.end());//将结果翻转
        return vv;
    }

4、 二叉树的最近公共祖先

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    bool GetPath(TreeNode* root, TreeNode* x,stack<TreeNode*>& path)
    {
        if(root == nullptr)
            return false; 
        //先入栈在判断
        path.push(root);
        //当前节点就是,直接返回
        //当前节点不是再去左边和右边找
        if(root == x)
            return true;
        
        bool Inleft = GetPath(root->left, x,path);
        if(Inleft)    
            return true; //在左边说明这个节点是路径节点,入栈成功

        bool Inright = GetPath(root->right, x,path);
        if(Inright)    
            return true; //在左边说明这个节点是路径节点,入栈成功
        
        //到这里说明不是路径节点
        path.pop();
        return false;
    }


    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
    {
        stack<TreeNode*> ppath;
        stack<TreeNode*> qpath;
        
        GetPath(root,p,ppath);
        GetPath(root,q,qpath);

        while(ppath.size() != qpath.size())
        {
            if(ppath.size() > qpath.size())
                ppath.pop();
            else
            {
                qpath.pop();
            }
        }

        while(ppath.top() != qpath.top())
        {
            ppath.pop();
            qpath.pop();
        }
        return ppath.top();
    }

5、 二叉搜索树与双向链表

在这里插入图片描述

在这里插入图片描述

	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* head = pRootOfTree;
		while(head && head->left)
		{
			head = head->left;
		}
		return head;
	}

6、 从前序与中序遍历序列构造二叉树

在这里插入图片描述
在这里插入图片描述

//思路:前序遍历确定跟,根据根的值在中序遍历中分割左右区间,链接在根的左右两侧,
 //然后递归下去

    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(inbegin <= inend)
        {
            if(preorder[prei] == inorder[rooti])
                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 i = 0;
        return _buildTree(preorder,inorder,i,0,inorder.size()-1);
    }

7、 从中序与后序遍历序列构造二叉树

在这里插入图片描述
在这里插入图片描述

TreeNode* _buildTree(vector<int>& inorder, vector<int>& postorder,int& posti,int inbegin,int inend) 
    {
        if(inbegin > inend)
            return nullptr;
        //先创建一个根
        TreeNode* root = new TreeNode(postorder[posti]);

        //找到根,将中序序列分割为左右子区间
        int rooti = inbegin;
        while(rooti <= inend)
        {
            if(inorder[rooti] == postorder[posti])
                break;
            else
                rooti++;
        }

        posti--;
        //链接[inbegin,rooti-1] rooti [rooti+1,inend]
        //先链接右子树,因为后序遍历是 左子树 右子树 根
        //从后向前就是根 右子树 左子树
        root->right = _buildTree(inorder, postorder,posti,rooti+1,inend);
        root->left = _buildTree(inorder, postorder,posti,inbegin,rooti - 1);
        
        return root;
    }


    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) 
    {
        int i = postorder.size() - 1;
        return _buildTree(inorder, postorder,i,0,inorder.size() - 1); 
    }

8、 二叉树的前序遍历-非递归

在这里插入图片描述

在这里插入图片描述

//将一棵树看成是左路节点和左路节点的右子树
//首先定义一个数组用来保存结果,定义一个栈,用来保存左路节点
//因为是前序遍历,首先将左路节点入数组和栈,直到cur是空结束了,
//然后取得栈顶元素,将栈顶的右子树给他(其实就是右路节点),循环出栈即可
    vector<int> preorderTraversal(TreeNode* root) 
    {
        stack<TreeNode*> st;
        vector<int> v;
        TreeNode* cur = root;
        while(cur || !st.empty())
        {
            //开始访问一棵树
            //左路节点
            //左路节点的右子树
            while(cur)
            {
                v.push_back(cur->val);
                st.push(cur);
                cur = cur->left;
            }

            //开始访问右子树
            TreeNode* top = st.top();
            st.pop();

            cur = top->right; //子问题访问右子树

        }
        return v;
    }

9、 二叉树的中序遍历-非递归

在这里插入图片描述
在这里插入图片描述

 vector<int> inorderTraversal(TreeNode* root) 
    {
        stack<TreeNode*> st;
        vector<int> v;
        TreeNode* cur = root;
        while(cur || !st.empty())
        {
            while(cur)
            {
                st.push(cur);
                cur = cur->left;
            }
            TreeNode* top = st.top();
            st.pop();
            v.push_back(top->val);

            cur = top->right;//子问题访问右子树
        }
        return v;
    }

10、 二叉树的后序遍历-非递归

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

vector<int> postorderTraversal(TreeNode* root) 
    {
        stack<TreeNode*> st;
        vector<int> v;
        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)
            {
                v.push_back(top->val);
                st.pop();
                prev = top;
            }
            else
            {
                //子问题访问左路节点
                cur = top->right;
            }
        }
        return v;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《二叉搜索树OJ》 的相关文章

随机推荐

  • 让ChatGPT介绍一下ChatGPT

    申请新必应内测通过了 我在New Bing中使用下ChatGPT 让ChatGPT介绍一下ChatGPT 问题1 帮我生成一篇介绍chatGPT的文章 不少于2000字 回答 chatGPT是什么 它有什么特点和用途 chatGPT是一种人
  • spring boot + mybatis puls + thymeleaf ,thymeleaf获取list中的map对象报错FTL stack trace ("~" means nesting

    求给位大佬帮忙解决下 我用的项目的是 spring boot mybatis puls thymeleaf 情况是这样的 我后台获取List
  • 函数连续,函数可微,函数可导,偏导数存在,偏导数连续之间的关系

    1 可导 即设y f x 是一个单变量函数 如果y在x x0处存在导数y f x 则称y在x x 0 处可导 如果一个函数在x0处可导 那么它一定在x0处是连续函数 函数可导定义 1 设f x 在x0及其附近有定义 则当a趋向于0时 若 f
  • 某盾js逆向_data参数详解_python代码还原

    注 本篇博客仅供学习使用 请勿用作其他商业用途 如有侵权 请联系本菜鸟 前面几篇文章介绍了cb fp actoken参数的获取办法 下面介绍check请求中data参数的生成方式 1 搜索data 打上断点 m参数的值和前面cb参数的值运算
  • 顺序查找与二分查找时间复杂度的比较

    注意要点 通过System currentTimeMills 来获取当前时间 来计算该算法运行运算时间 顺序查找的时间复杂度为O n 二分查找的时间复杂度为O log n 但两者的运行时间的结果却千差万别 可知当计算量很大的情况下算法优化的
  • Java中的volatile

    文章目录 1 volatile的内存语义 2 内存屏障 2 happens before 之 volatile 变量规则 4 Demo 1 volatile的内存语义 内存可见性 volatile是Java提供的一种轻量级的同步机制 在并发
  • windows11 elasticsearch-head 插件安装

    1 elasticsearch head 插件介绍 elasticSearch head就是一款能连接ElasticSearch搜索引擎 并提供可视化的操作页面对elasticSearch搜索引擎进行各种设置和数据检索功能的管理插件 如在h
  • 十个C语言项目,从小白到月入10K

    每年的就业季都有很多同学惆怅 在校期间没有项目经历 简历一片空白 不知道该怎么写 所以今天为大家盘点了十个C C 项目 由浅入深 可以作为就业或者考研复试的在校项目经历 也可以用作毕业设计 直奔主题 一 通讯管理系统 难度系数 代码量 40
  • 2023华为od机试Java B卷【最长回文串】

    题目 回文串的定义时 某个字符串正读和反读结果完全一样 以下例子就是回文串 1 leVel符合回文串的定义 因为它的正读和反读都是leVel 同理a也是 回文串 2 art不符合回文串的定义 因为它的反读tra与正读不同 现在给你若干个字母
  • listview中listitem点击实现沿曲线移动动画效果

    现在有这样一个需求 点击listview中的任意一个item 出现一个轨迹为曲线的动画 我们知道Android动画分为帧动画 Frame 和补间动画 Tween 两种 帧动画和gif类似 将不同的帧以一定速度连续播放产生动画 需要我们事先准
  • 车牌识别中的不分割字符的端到端(End-to-End)识别

    传统的车牌识别过程是往往是这样的 车牌定位 gt 车牌判断 gt 车牌字符的分割 gt 车牌字符的识别 这种方法有个好处就是 仅仅需要较少的字符样本即可用于分类器的训练 在光照 相机条件好的情况下也能取得较好的效果 现在大多数商业车牌识别软
  • OKEX行情接口对接实例

    系统说明 开发语言 net core mssql2019 采用socket 订阅官方接收行情数据 可接收 市场 深度 行情 交易等数据
  • 炫酷的倒计时效果,祝福春节

    前言 春节将至 小福利 炫酷的倒计时效果 效果图 实现源码
  • JVM系列(七) JVM 垃圾收集器

    我们知道JVM会回收垃圾 但是每种垃圾收集器的收集机制和收集的方法都不一样 今天我们讨论下几种垃圾回收机制 1 按照垃圾区域划分垃圾收集器 我们可以按照垃圾存在的区域来划分垃圾收集器 垃圾在堆内的区域分为 新生代垃圾 老年代垃圾 新生代老年
  • aligned_alloc

    aligned alloc 函数 C C 函数签名 void aligned alloc size t alignment size t size 函数定义在
  • java代码实现下拉列表框多选操作

    实现操作 实现如图所示功能 前端没有学习 故本文只写后端内容 一 数据库 CREATE TABLE axa risk quantification id bigint 20 NOT NULL AUTO INCREMENT assets va
  • VSCode Remote-SSH (Windows)

    1 VSCode 安装 VSCode 2 安装扩展 Remote SSH Getting started Follow the step by step tutorial or if you have a simple SSH host s
  • Canny边缘检测算法原理及其VC实现详解(一)

    目录 1 边缘检测原理及步骤 2 Canny边缘检测算法原理 2 1 对原始图像进行灰度化 2 2 对图像进行高斯滤波 2 3 用一阶偏导的有限差分来计算梯度的幅值和方向 2 4 对梯度幅值进行非极大值抑制 2 5 用双阈值算法检测和连接边
  • jsp下拉框级联查询以及java代码实现

    需求描述 我们在开发过程中 很多页面查询 新增修改页面的下拉 需要通过一个下拉框的值 确定另一个下拉的值 典型的就是 选择年级 另一个下拉需要展示对应的班级 选择了班级 需要展示对应的学生 下面是存放地方 建筑物 级联查询建筑物与房间的例子
  • 《二叉搜索树OJ》

    文章目录 1 根据二叉树创建字符串 https leetcode cn problems construct string from binary tree 2 二叉树的层序遍历 https leetcode cn problems bin