C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)
发布时间 - 2026-01-11 02:32:32 点击率:次C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)

二叉树的性质:
二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。
例:
实例代码:
#include <iostream>
#include <Windows.h>
#include <stack>
using namespace std;
template <class T>
struct BinaryTreeNode
{
int _data;
BinaryTreeNode<T>* _left; //左孩子
BinaryTreeNode<T>* _right; //右孩子
BinaryTreeNode(const T& data)
:_data(data)
, _left(NULL)
, _right(NULL)
{}
};
template <class T>
class BinaryTree
{
typedef BinaryTreeNode<T> Node;
public:
BinaryTree()
:_root(NULL)
{}
BinaryTree(T* arr, size_t n, const T& invalid=T())
{
size_t index = 0;
_root = _CreatTree(arr, n, invalid, index);
}
void PreOrderR() //前序遍历 递归
{
_PreOrderR(_root);
}
void PreOrder() //前序遍历 非递归
{
_PreOrder(_root);
}
void InOrderR() //中序遍历 递归
{
_InOrderR(_root);
}
void InOrder() //中序遍历 非递归
{
_InOrder(_root);
}
void PostOrderR() //后序遍历 左 右 根 递归
{
_PostOrderR(_root);
}
void PostOrder() //后序遍历 左 右 根 非递归
{
_PostOrder(_root);
}
~BinaryTree()
{}
protected:
//建树 arr:建树使用的数组 n:数组大小 invalid:非法值 index:当前下标
Node* _CreatTree(T* arr, size_t n, const T& invalid, size_t& index)
{
Node* root = NULL;
if (index < n && arr[index] != invalid)
{
root = new Node(arr[index]); //根节点
root->_left = _CreatTree(arr, n, invalid, ++index);
root->_right = _CreatTree(arr, n, invalid, ++index);
}
return root;
}
void _PreOrderR(Node* root) //前序遍历 递归
{
if (root == NULL)
{
return;
}
cout << root->_data << " ";
_PreOrderR(root->_left);
_PreOrderR(root->_right);
}
void _PreOrder(Node* root) //前序遍历 非递归
{
stack<Node*> tty;
while (root != NULL || !tty.empty())
{
if (root)
{
cout << root->_data << " ";
tty.push(root);
root = root->_left;
}
else
{
Node* temp = tty.top();
tty.pop();
root = temp->_right;
}
}
}
void _InOrderR(Node* root) //中序遍历 递归
{
if (root == NULL)
{
return;
}
_InOrderR(root->_left);
cout << root->_data << " ";
_InOrderR(root->_right);
}
void _InOrder(Node* root) //中序遍历 非递归
{
if (root == NULL)
{
return;
}
stack<Node*> tty;
while (root != NULL || !tty.empty())
{
while (root)
{
tty.push(root);
root = root->_left;
}
//此时出了循环走到了最左叶子节点
Node* temp = tty.top();
tty.pop();
cout << temp->_data << " ";
root = temp->_right;
}
}
void _PostOrderR(Node* root) //后序遍历 左 右 根 递归
{
if (root == NULL)
{
return;
}
_PostOrderR(root->_left);
_PostOrderR(root->_right);
cout << root->_data << " ";
}
void _PostOrder(Node* root) //后序遍历 左 右 根 非递归
{
if (root == NULL)
{
return;
}
stack<Node*> tty;
Node* PreNode = NULL; //上一个访问的结点
tty.push(root);
while (!tty.empty())
{
Node* cur = tty.top();
//访问的当前节点左右孩子均为空或者当前节点左右子树均已经访问过
if ((cur->_left == NULL && cur->_right == NULL) || ((PreNode != NULL) && (PreNode == cur->_left || PreNode == cur->_right)))
{
cout << cur->_data << " ";
tty.pop();
PreNode = cur;
}
else
{
if (cur->_right != NULL)
{
tty.push(cur->_right);
}
if (cur->_left != NULL)
{
tty.push(cur->_left);
}
}
}
}
protected:
Node* _root;
};
#include "源.h"
void Test()
{
int array[10] = { 1, 2, 3, '#', '#', 4, '#', '#', 5, 6 };
BinaryTree<int> p(array, sizeof(array) / sizeof(array[0]), '#');
cout << "前序递归遍历: " << "";
p.PreOrderR();
cout << endl;
cout << "前序非递归遍历: " << "";
p.PreOrder();
cout << endl;
cout << "中序递归遍历: " << "";
p.InOrderR();
cout << endl;
cout << "中序非递归遍历: " << "";
p.InOrder();
cout << endl;
cout << "后序递归遍历: " << "";
p.PostOrderR();
cout << endl;
cout << "后序非递归遍历: " << "";
p.PostOrder();
cout << endl;
}
int main()
{
Test();
system("pause");
return 0;
}
实现效果:
以上就是数据结构二叉树的详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# C++
# 数据结构二叉树
# 数据结构二叉树的实现
# 数据结构二叉树递归
# 数据结构二叉树完全二叉树
# C++ 非递归实现二叉树的前中后序遍历
# C++非递归队列实现二叉树的广度优先遍历
# C++实现二叉树非递归遍历方法实例总结
# 二叉树遍历 非递归 C++实现代码
# 探讨:C++实现链式二叉树(用非递归方式先序
# 中序
# 后序遍历二叉树)
# C++实现二叉树非递归遍历算法详解
# 递归
# 遍历
# 二叉树
# 数据结构
# 子树
# 出了
# 最多
# 如有
# 均为
# 希望能
# 谢谢大家
# 一棵
# 均已
# 疑问请
# 有两个
# _data
# _right
# _left
# template
# std
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
如何快速搭建高效可靠的建站解决方案?
高防服务器如何保障网站安全无虞?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
javascript读取文本节点方法小结
C++时间戳转换成日期时间的步骤和示例代码
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Android使用GridView实现日历的简单功能
JavaScript如何实现错误处理_try...catch如何捕获异常?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何在Tomcat中配置并部署网站项目?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Laravel定时任务怎么设置_Laravel Crontab调度器配置
文字头像制作网站推荐软件,醒图能自动配文字吗?
郑州企业网站制作公司,郑州招聘网站有哪些?
JavaScript中的标签模板是什么_它如何扩展字符串功能
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
JS中对数组元素进行增删改移的方法总结
Python图片处理进阶教程_Pillow滤镜与图像增强
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
公司门户网站制作流程,华为官网怎么做?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Python结构化数据采集_字段抽取解析【教程】
教你用AI将一段旋律扩展成一首完整的曲子
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
打造顶配客厅影院,这份100寸电视推荐名单请查收
北京网站制作的公司有哪些,北京白云观官方网站?
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
详解Oracle修改字段类型方法总结
php 三元运算符实例详细介绍
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
Java垃圾回收器的方法和原理总结
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
,网页ppt怎么弄成自己的ppt?
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
海南网站制作公司有哪些,海口网是哪家的?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
青岛网站建设如何选择本地服务器?
如何用美橙互联一键搭建多站合一网站?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Python函数文档自动校验_规范解析【教程】
如何快速生成凡客建站的专业级图册?
Laravel如何自定义错误页面(404, 500)?(代码示例)
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
上一篇:u盘怎么找隐藏文件
上一篇:u盘怎么找隐藏文件

