当前位置: 首页 > news >正文

二叉树中序遍历非递归+递归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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux之网络命令
  • My_string 运算符重载,My_stack
  • MES系统如何提升制造企业的运营效率和灵活性
  • 深入剖析链表反转:多语言实现与高级语法特性20240924
  • 软件测试面试题(6)——二面(游戏测试)
  • 怎么设置u盘不让别人拷贝?八个方法集锦,一分钟教会你!(最全攻略来了)
  • 计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21
  • 2024年汉字小达人区级自由报名比赛正式开始,大家最关注的问题解答
  • JavaScript 操作 DOM元素CSS 样式的几种方法
  • 电销系统办理步骤,一共分为几个步骤
  • 加速AI数据应用,肯睿Cloudera推出六款全新机器学习项目加速器AMPs
  • 2024年 AI大模型我该买一张什么卡?
  • 面向对象程序设计原则
  • AI时代的程序员:如何保持和提升核心竞争力
  • 【Linux网络 —— 网络基础概念】
  • CSS居中完全指南——构建CSS居中决策树
  • go append函数以及写入
  • js作用域和this的理解
  • Spring声明式事务管理之一:五大属性分析
  • Vue2.0 实现互斥
  • WePY 在小程序性能调优上做出的探究
  • windows下使用nginx调试简介
  • Yii源码解读-服务定位器(Service Locator)
  • 搞机器学习要哪些技能
  • 开源SQL-on-Hadoop系统一览
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 来,膜拜下android roadmap,强大的执行力
  • 前端攻城师
  • 我是如何设计 Upload 上传组件的
  • 小程序01:wepy框架整合iview webapp UI
  • 鱼骨图 - 如何绘制?
  • 原生 js 实现移动端 Touch 滑动反弹
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 06-01 点餐小程序前台界面搭建
  • raise 与 raise ... from 的区别
  • 如何正确理解,内页权重高于首页?
  • 整理一些计算机基础知识!
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #面试系列-腾讯后端一面
  • (10)STL算法之搜索(二) 二分查找
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (第二周)效能测试
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (九)信息融合方式简介
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十三)Maven插件解析运行机制
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)人的集合论——移山之道
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net core 的缓存方案
  • .NET 反射 Reflect
  • .net 简单实现MD5