【C++】二叉树进阶面试题(下)

目录

6. 根据一棵树的前序遍历与中序遍历构造二叉树

题目

分析

代码

7. 根据一棵树的中序遍历与后序遍历构造二叉树

题目

分析

代码

8. 二叉树的前序遍历,非递归迭代实现 

题目

分析

代码

9. 二叉树中序遍历 ,非递归迭代实现

题目

分析

代码

10. 二叉树的后序遍历 ,非递归迭代实现

题目

分析

代码


6. 根据一棵树的前序遍历与中序遍历构造二叉树

题目

OJ链接

分析

前序遍历的第一个结点一定是根节点,根据根结点在中序结点的位置可以划分出根节点的左右结点范围,然后根据递归调用,不断地划分子树的左右结点,代码如下

代码

class Solution {
public:
    TreeNode* createTree(vector<int>& preorder, vector<int>& inorder,int& cur,int begin,int end)
    {
        if (begin > end)
            return nullptr;
        int root = begin;
        //寻找根节点在中序遍历的位置
        while (root <= end)
        {
            if (preorder[cur] == inorder[root])
                break;
            ++root;
        }
        TreeNode* ret = new TreeNode(preorder[cur++]);
        ret->left=createTree(preorder, inorder, cur, begin, root-1);
        ret->right=createTree(preorder, inorder, cur, root+1, end);
        return ret;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if (preorder.empty() || inorder.empty())
            return nullptr;
        int cur=0;
        int begin = 0;
        int end = inorder.size() - 1;
        return createTree(preorder, inorder,cur,begin,end);
    }
};

7. 根据一棵树的中序遍历与后序遍历构造二叉树

题目

OJ链接

分析

方法跟上一题类似,只是后续遍历的根节点要从最后一位找,并且向前遍历,同时要注意先找右子树再找左子树。

代码

class Solution {
public:
    TreeNode* createTree(vector<int>& postorder, vector<int>& inorder, int& cur, int begin, int end)
    {
        if (begin > end)
            return nullptr;
        int root = begin;
        while (root <= end)
        {
            if (postorder[cur] == inorder[root])
                break;
            ++root;
        }
        TreeNode* ret = new TreeNode(postorder[cur--]);

        ret->right = createTree(postorder, inorder, cur, root + 1, end);
        ret->left = createTree(postorder, inorder, cur, begin, root - 1);
        return ret;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if (postorder.empty() || inorder.empty())
            return nullptr;
        int cur = inorder.size() - 1;
        int begin = 0;
        int end = cur;
        return createTree(postorder, inorder, cur, begin, end);
    }
};

8. 二叉树的前序遍历,非递归迭代实现 

题目

OJ链接

分析

任意一个树我们都可以分为两部分:左路结点和左路结点的右子树,如下图

左路结点的右子树又可以分为新的左路结点和左路结点的右子树

通过这种思路,如下代码所示

代码

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ans;
        if (root == nullptr)
            return ans;
        TreeNode* cur = root;
        stack<TreeNode*> st;
        while (!st.empty()||cur)
        {
            //插入所有左路结点到栈中
            while (cur)
            {
                st.push(cur);
                ans.push_back(cur->val);
                cur = cur->left;
            }
            //对左路结点进行出栈,并将左路结点的右子树的根作为新的cur结点
            //下一层循环访问右子树的所有左路结点插入到栈中
            TreeNode* top = st.top();
            st.pop();
            cur = top->right;

        }
        return ans;
    }
};

9. 二叉树中序遍历 ,非递归迭代实现

题目

OJ链接

分析

将上一题的ans.push_back放到下面既可以完成

代码

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        if (root == nullptr)
            return ans;
        TreeNode* cur = root;
        stack<TreeNode*> st;
        while (!st.empty()||cur)
        {
            while (cur)
            {
                st.push(cur);

                cur = cur->left;
            }
            TreeNode* top = st.top();
            st.pop();
            ans.push_back(top->val);
            cur = top->right;

        }
        return ans;
    }
};

10. 二叉树的后序遍历 ,非递归迭代实现

题目

OJ链接

分析

因为是后序遍历,父亲结点最后插入,所以要判断右结点是否为空或者右结点是上一次访问过的结点

代码

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> ans;
        if (root == nullptr)
            return ans;
        TreeNode* prenode = nullptr;
        TreeNode* cur = root;
        stack<TreeNode*> st;
        while (!st.empty() || cur) {
            while (cur) {
                st.push(cur);
                cur = cur->left;
            }
            TreeNode* top = st.top();

            if (top->right == nullptr || prenode == top->right) {
                st.pop();
                ans.push_back(top->val);
                prenode = top;
            } else {
                cur = top->right;
            }
        }
        return ans;
    }
};

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

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

相关文章

什么是5G边缘计算网关?

随着5G技术的飞速发展和普及&#xff0c;边缘计算作为5G时代的关键技术之一&#xff0c;正日益受到业界的关注。而5G边缘计算网关&#xff0c;作为连接5G网络和边缘计算节点的桥梁&#xff0c;扮演着至关重要的角色。HiWoo Box&#xff0c;作为一款卓越的5G边缘计算网关&#x…

在虚拟机vm下的Linux系统下 安装redis 超详细

打开Linux后 右键打开终端 1.输入:su root 登录root 密码是123456 2.然后输入:yum -y install gcc-c 安装gcc基础依赖包 3.yum -y install centos-release-scl 4.yum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils //为了编译最新版本的Redis源码 用…

数据分析案例-二手车用户数据可视化分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

哪种杠杆最安全?允许的最低杠杆是多少?WeTrade一篇文章讲清楚

各位投资者都知道外汇交易中的财务杠杆其实就是一种期权&#xff0c;允许交易者以数倍于交易保证金的实际金额进行交易。保证金交易的一种工具&#xff0c;这就是投资者借入的资金&#xff0c;用于增加持仓量&#xff0c;从而增加自己的利润&#xff0c;避免自己的资金不足。We…

MS8911S/8921S/8922M/8931S——4ns 延时、轨到轨高速比较器

产品简述 MS8911S/MS8921S/MS8922M/MS8931S 是一款具 有内部迟滞的高速比较器。其电源电压范围为 3.0V- 5.5V &#xff0c;输入和输出范围均可做到轨到轨。其输出为推 挽结构&#xff0c;兼容 CMOS/TTL 逻辑电平标准。传输延时为 4ns &#xff0c;且失调电压低。单一比…

7种数组排序算法(多语言描述)

912. 排序数组 冒泡排序 C void bubble_sort(vector<int>& nums) {bool sorted false;int N nums.size();while (!sorted) {sorted true;for (int i 1; i < N; i) {if (nums[i - 1] > nums[i]) {swap(nums[i - 1], nums[i]);sorted false;}}N--;} }Pyt…

TinyEMU编译与使用(一)

TinyEMU编译与使用&#xff08;一&#xff09; 1 介绍2 准备工作3 编译TinyEMU3.1 安装依赖库3.2 编译 4 运行TinyEMU4.1 在线运行4.2 离线运行 5 共享目录5.1 修改root_9p-riscv64.cfg5.2 启动TinyEMU5.3 执行挂载命令 6 TinyEMU命令帮助 1 介绍 原名为riscvemu&#xff0c;于…

OpenHarmony下musl编译工具链普法

OpenHarmony下musl编译工具链普法 引言 欠的债总是要还的&#xff0c;这不前面欠的关于OpenHarmony下musl相关的还是要还的。这里我对其中的相关知识点&#xff0c;梳理&#xff0c;归纳重新消化下&#xff01; 一.GCC/Clang/LLVM的区别与联系 说实话&#xff0c;这块我现在都…

基于springboot的月度员工绩效考核管理系统论文

摘 要 科学时代的发展改变了人类的生活&#xff0c;促使网络与计算机技术深入人类的各个角落&#xff0c;得以普及到人类的具体生活中&#xff0c;为人类的时代文明掀开新的篇章。本系统为月度员工绩效考核管理系统&#xff0c;是专为企业开发的对员工考核的协助软件。可以帮助…

video视频播放

1.列表页面 <template><div><ul><li class"item" v-for"(item,index) in list" :key"index" click"turnPlay(item.videoUrl)"><img :src"item.img" alt""><div class"btn…

教资截流,值得一做的项目

从去年9月份开始&#xff0c;教资这个类目基本上就成熟了&#xff0c;所以截流就出来了。 有流量的地方&#xff0c;就有截流。 12月教资截流&#xff0c;值得一做的项目 截流万变不离其宗&#xff0c;就是去别人有流量的文章或者视频下面截流。 我记得今年7月的时候&#xff…

K线实战分析系列之二十一:三星形态——罕见的反转信号

K线实战分析系列之二十一&#xff1a;三星形态——罕见的反转信号 一、三星形态二、三星形态总结 一、三星形态 二、三星形态总结 三星形态由三根十字线组成&#xff0c;是反转信号&#xff0c;在行情阶段性的顶部或者是底部出现典型的三星形态中间的十字线收盘价高于前一根和…

Docker实战——使用 Docker Compose 进行服务编排

目录 安装配置 Docker Compose方法一&#xff1a;方法二&#xff1a; 进行服务编排使用手动方式部署应用1、使用 Python 创建 Web 应用&#xff08;创建文件“app.py”&#xff09;&#xff0c;文件内容如下&#xff1a;2、创建 “requirements.txt” 文件&#xff0c;由于在应…

根据关键词过滤内容

package com.example.test.utils;import java.util.*;/*** Author leo* Date 2024/3/6 10:41* description: 敏感词工具类* Title: MgcUtils* Package org.jeecg.modules.yygl.dbwgl*/ public class MgcUtils {private static Map<String, Object> dictionaryMap null;p…

EasyX的学习2

消息处理——漂亮的按钮(鼠标) 用到的函数 1.消息结构体变量类型&#xff1a;使用ExMessage ExMessage msg{ 0 }; 定义一个变量名为msg的ExMessage结构体变量并初始化为0 2.获取消息函数&#xff1a;peekmessage函数 //获取消息 peekmessage(&msg, EX_MOUSE); 两个参…

阿里云几核服务器够用?内存多少合适?

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

Git分布式管理-头歌实验远程版本库

Git的一大特点就是&#xff0c;能为不同系统下的开发者提供了一个协作开发的平台。而团队如果要基于Git进行协同开发&#xff0c;就必须依赖远程版本库。远程版本库允许&#xff0c;我们将本地版本库保存在远端服务器&#xff0c;而且&#xff0c;不同的开发者也是基于远程版本…

算法Day04_203.移除链表元素

推荐阅读 算法day01_ 27. 移除元素、977.有序数组的平方 算法day02_209.长度最小的子数组 算法day03_ 59.螺旋矩阵II 目录 推荐阅读203.移除链表元素题目思路解法暴力解法虚拟头结点解法 203.移除链表元素 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删…

Python爬虫实战第三例【三】【上】

零.实现目标 爬取视频网站视频 视频网站你们随意&#xff0c;在这里我选择飞某速&#xff08;狗头保命&#xff09;。 例如&#xff0c;作者上半年看过的“铃芽之旅”&#xff0c;突然想看了&#xff0c;但是在正版网站看要VIP&#xff0c;在盗版网站看又太卡了&#xff0c;…

大模型快速实现python3+html内容在线渲染

需求&#xff1a; 有一份数据需要通过前端在线展示给用户&#xff0c;不需要复杂的样式交互&#xff0c;后端服务是基于Python3实现的API接口&#xff0c;对前端技术不是很了解&#xff0c;需要快速实现该需求。类似样式即可&#xff1a; 思路&#xff1a; 如果页面不复杂&am…