二叉树中序遍历非递归+递归C++实现

非递归版本:
 

#include<iostream>
#include<stack>
using namespace std;
struct TreeNode {int _val;TreeNode* left, * right;TreeNode(const int& val) :_val(val), left(nullptr), right(nullptr) {}~TreeNode() {delete left, right;}
};
void inorderTraversal(TreeNode* root) {TreeNode* cur = root;stack<TreeNode*> st;while (cur || !st.empty()) {while (cur) {st.push(cur);cur = cur->left;}cur = st.top();st.pop();cout << cur->_val << " ";cur = cur->right;}
}
int main() {// 用例1:简单的二叉搜索树TreeNode* root1 = new TreeNode(5);root1->left = new TreeNode(3);root1->right = new TreeNode(7);root1->left->left = new TreeNode(2);root1->left->right = new TreeNode(4);root1->right->left = new TreeNode(6);root1->right->right = new TreeNode(8);cout << "Inorder traversal of BST: ";inorderTraversal(root1);cout << endl;// 用例2:只有一个节点的树TreeNode* root2 = new TreeNode(10);cout << "Inorder traversal of single node tree: ";inorderTraversal(root2);cout << endl;// 用例3:空树TreeNode* root3 = nullptr;cout << "Inorder traversal of empty tree: ";inorderTraversal(root3);cout << endl;// 用例4:不平衡的树TreeNode* root4 = new TreeNode(1);root4->left = new TreeNode(2);root4->left->left = new TreeNode(3);root4->left->left->left = new TreeNode(4);cout << "Inorder traversal of unbalanced tree: ";inorderTraversal(root4);cout << endl;// 用例5:退化成链表的树TreeNode* root5 = new TreeNode(1);TreeNode* cur = root5;for (int i = 2; i <= 5; ++i) {cur->right = new TreeNode(i);cur = cur->right;}cout << "Inorder traversal of linked list tree: ";inorderTraversal(root5);cout << endl;// 释放所有节点的内存delete root1;delete root2;delete root3; // 虽然是空指针,但delete空指针是安全的delete root4;delete root5;return 0;
}

值得注意的点:

1.stack中存放的是树的节点的地址也就是TreeNode*类型。

2. TreeNode的析构函数千万不要忘记,因为我们是在堆上申请的内存。

3.delete空指针什么都不做。


下面我们实现递归版本,这个要容易地多。

#include<iostream>
#include<stack>
using namespace std;
struct TreeNode {int _val;TreeNode* left, * right;TreeNode(const int& val) :_val(val), left(nullptr), right(nullptr) {}~TreeNode() {delete left, right;}
};
void inorderTraversal(TreeNode* root) {if (root == nullptr)return;inorderTraversal(root->left);cout << root->_val << " ";inorderTraversal(root->right);    
}
int main() {// 用例1:简单的二叉搜索树TreeNode* root1 = new TreeNode(5);root1->left = new TreeNode(3);root1->right = new TreeNode(7);root1->left->left = new TreeNode(2);root1->left->right = new TreeNode(4);root1->right->left = new TreeNode(6);root1->right->right = new TreeNode(8);cout << "Inorder traversal of BST: ";inorderTraversal(root1);cout << endl;// 用例2:只有一个节点的树TreeNode* root2 = new TreeNode(10);cout << "Inorder traversal of single node tree: ";inorderTraversal(root2);cout << endl;// 用例3:空树TreeNode* root3 = nullptr;cout << "Inorder traversal of empty tree: ";inorderTraversal(root3);cout << endl;// 用例4:不平衡的树TreeNode* root4 = new TreeNode(1);root4->left = new TreeNode(2);root4->left->left = new TreeNode(3);root4->left->left->left = new TreeNode(4);cout << "Inorder traversal of unbalanced tree: ";inorderTraversal(root4);cout << endl;// 用例5:退化成链表的树TreeNode* root5 = new TreeNode(1);TreeNode* cur = root5;for (int i = 2; i <= 5; ++i) {cur->right = new TreeNode(i);cur = cur->right;}cout << "Inorder traversal of linked list tree: ";inorderTraversal(root5);cout << endl;// 释放所有节点的内存delete root1;delete root2;delete root3; // 虽然是空指针,但delete空指针是安全的delete root4;delete root5;return 0;
}

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

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

相关文章

openai最新o1上线(2024年09月12日)

gpt-4o-2024-08-06输出文本价格 10美元/M o1-preview输出价格 60美元/M https://lmarena.ai/?leaderboard 数字9.11和9.8谁大些 人工智能学习网站 https://chat.xutongbao.top/

Vue(16)——Vue3.3新特性

defineOptions 在 Vue 3.3 之前&#xff0c;如果需要在 <script setup> 中设置组件名&#xff0c;通常需要在额外的 <script> 标签中使用 Options API 进行配置。defineOptions 是 Vue 3.3 版本中引入的一个宏&#xff08;macro&#xff09;&#xff0c;它主要用于…

C++ bitset(位图)的介绍和使用

文章目录 一、bitset的介绍1. 位图的引入2. 位图的概念3. 位图的应用场景 二、bitset的使用1. 定义方式2. 成员函数3. 运算符重载 一、bitset的介绍 1. 位图的引入 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是…

2024年蓝牙网关市场热门产品选购宝典

在本文中&#xff0c;我们将探讨不同类型的蓝牙网关及其分类&#xff0c;并提供一份指南&#xff0c;帮助您筛选出最适合的物联网网关。 室内蓝牙网关 室内网关通常用于智能建筑解决方案&#xff0c;如智能家居、零售店、购物中心和办公室。 这些网关的覆盖范围较短&#xff…

人工智能代表——无人驾驶:萝卜快跑

人工智能如何改变我们的出行&#xff1a;以“萝卜快跑”无人驾驶为例 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的方式渗透并改变着我们的日常生活&#xff0c;其中出行方式的变革尤为显著。在众多AI驱动的出行创新中&#xff0c;“萝卜…

【hot100-java】【缺失的第一个正数】

R9-普通数组篇 class Solution {public int firstMissingPositive(int[] nums) {int nnums.length;for (int i0;i<n;i){while(nums[i]>0&&nums[i]<n&&nums[nums[i]-1]!nums[i]){//交换nums[i]和nums[nums[i]-1]int temp nums[nums[i]-1];nums[nums[i]…

C语言课程设计题目(24个选题)

C语言课程设计题目 一、设计要求与设计报告二、检查要求三、打分标准四、提交时间五、选题要求题目列表题目一&#xff1a;职工信息管理系统设计题目二&#xff1a;图书信息管理系统设计题目三&#xff1a;图书管理系统设计题目四&#xff1a;实验设备管理系统设计题目五&#…

回答网友的一个SQL问题

网友问&#xff1a; CODE NAME 1 A 1 B 如何得到下面的值&#xff0c;该如何写SQL CODE NAME 1 AB 1 AB 俺的回答&#xff1a; declare t table(code varchar(50),name varchar(50)) insert into t(code,name) select 1,A union select…

python脚本程序怎么写更优雅?argparse模块巧妙应用

前言 命令行程序&#xff0c;也称CLI程序&#xff0c;另一个直观的名字是脚本程序&#xff0c;简称脚本&#xff0c;由于没有图形用户界面&#xff08;GUI&#xff09;&#xff0c;所以脚本程序常见的交互方式有3种&#xff1a; 1、脚本程序中读取环境变量&#xff0c;比如env…

Spring Security学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

【深度学习】深度卷积神经网络(AlexNet)

在 LeNet 提出后&#xff0c;卷积神经网络在计算机视觉和机器学习领域中很有名气&#xff0c;但并未起到主导作用。 这是因为 LeNet 在更大、更真实的数据集上训练的性能和可行性还有待研究。 事实上&#xff0c;在 20 世纪 90 年代到 2012 年之间的大部分时间里&#xff0c;…

电线杆上电气组件检测系统源码分享

电线杆上电气组件检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

视频怎么制作成二维码?视频轻松生成二维码的3步操作

现在很多人为了能够更快捷的实现视频内容的分享&#xff0c;会通过将视频生成二维码的方式&#xff0c;让其他人可以通过扫描二维码来查看视频内容。这种方式不需要用户存储视频&#xff0c;扫码就能够在设备上查看视频&#xff0c;有利于提升查看视频的便捷性&#xff0c;可以…

【秋招笔试题】多多排序

解法&#xff1a;简单语法题 package com.sky;import java.util.*;public class Test1 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int N sc.nextInt();int M sc.nextInt();List<String> words new ArrayList<>(N);for (in…

关于TrustedInstaller权限

前言 我们在在删除某些文件时会发现权限不够的情况&#xff0c;那是因为自从 Windows Vista 以来&#xff0c;为了提升安全性&#xff0c;微软对于权限的把控越来越紧。为了对抗恶意软件随意修改系统文件&#xff0c;Trustedinstaller 应运而生。 各权限之间的关系 普通人:Us…

C++STL--------string

文章目录 一、STL介绍二、string1、constructor构造函数2、operator[]方括号运算符重载3、iterator迭代器4、reverse_iterator反向迭代器5、size和length6、capacity7、clear8、shrink_to_fit9、at10、push_back11、append 二、auto类型(C11)1、使用2、真正的价值 三、范围for(…

python全栈学习记录(十八)re、os和sys、subprocess

re、os和sys、subprocess 文章目录 re、os和sys、subprocess一、re1.正则字符2.正则表达式的使用3.group的使用4.贪婪匹配与惰性匹配5.其他注意事项 二、os和sys1.os2.sys 三、subprocess 一、re python中的re模块用来使用正则表达式&#xff0c;正则就是用一系列具有特殊含义…

2024 年最新 Protobuf 结构化数据序列化和反序列化详细教程

Protobuf 序列化概述 Protobuf&#xff08;Protocol Buffers&#xff09;是由Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它用于在不同系统之间高效地交换数据。Protobuf使用定义文件&#xff08;.proto&#xff09;来描述数据结构&#xff0c;并通过…

Pytest测试实战|执行方式

Pytest测试实战 The pytest framework makes it easy to write small, readable tests, and can scale to support complex functional testing for applications and libraries. 这段话很好地阐述了Pytest的设计思想与强大的特性。在之前阐述了Pytest编写测试用例规范与搜索规…

R包:gplots经典热图

加载R包 # install.packages("gplots")library("gplots")数据 mat <- matrix(rnorm(1200), ncol6)画图1 heatmap.2(xmat)画图2 heatmap.2(xmat, ColvFALSE, dendrogram"row",scale"row",col"bluered",trace"non…