【算法与数据结构】二叉树的 中序 遍历
前一篇写了二叉树的先序遍历,本篇记录一下二叉树的中序遍历,主要是非递归形式的中序遍历。
由于距离上篇有好几天了,所以这里把二叉树的创建和存储结构也重复的写了一遍。
二叉树如下
二叉树的存储方式依然是二叉链表方式,其结构如下
typedef struct _tagBinTree
{
unsigned char value;
struct _tagBinTree* left;
struct _tagBinTree* right;
}BinTree, *PBinTree;
先序递归形式的创建二叉树代码如下:
void InitBinTree(PBinTree& pRoot)
{
cout<<"请输入节点的值, #表示NULL:";
unsigned char ch = 0;
cin >> ch;
if ('#' == ch)
{
pRoot = NULL;
}
else
{
pRoot = new BinTree();
if (NULL == pRoot)
{
exit(-1);
}
pRoot->value = ch;
InitBinTree(pRoot->left);
InitBinTree(pRoot->right);
}
}
执行情况

访问二叉树,这里只是打印了一下节点的值
void Visit(PBinTree pNode)
{
cout << "节点的值为 "<<pNode->value<<endl;
}
非递归方式中序遍历二叉树原理
/************************************************************************/
/* 非递归中序遍历二叉树
存储方式为二叉链表,原理如下:
中序遍历的次序为左子树,根节点,右子树
首先将根节点入栈
while(栈不空)
{
取栈顶元素a
if(a不为NULL)
{
将栈顶元素的左子树入栈
}
else
{
栈顶元素a(为NULL)出栈
if(此时栈不为空)
{
将栈顶元素b出栈,访问此节点,将b的右子树入栈
}
}
}
/************************************************************************/
非递归中序遍历代码
void MidOrderTraverse(PBinTree& pRoot)
{
stack<PBinTree> stBinTree;
//根节点入栈
stBinTree.push(pRoot);
while(! stBinTree.empty())
{
//取栈顶元素
PBinTree pNode = stBinTree.top();
//栈顶元素不为NULL
if (pNode != NULL)
{
stBinTree.push(pNode->left);
}
else
{
//栈顶元素为NULL,将其出栈
stBinTree.pop();
//如果此时栈不为空
if (! stBinTree.empty())
{
//将栈顶元素出栈,访问此节点,并将其右子树入栈
pNode = stBinTree.top();
stBinTree.pop();
Visit(pNode);
stBinTree.push(pNode->right);
}
}
}
}
main函数
int _tmain(int argc, _TCHAR* argv[])
{
cout << "\r\n-----------开始 递归先序构造二叉树 -----------\r\n";
PBinTree pRoot = NULL;
InitBinTree(pRoot);
cout << "\r\n-----------结束 递归先序构造二叉树 -----------\r\n";
cout << "\r\n\r\n----------开始 非递归中序遍历二叉树------------\r\n";
MidOrderTraverse(pRoot);
cout << "-----------结束 非递归中序遍历二叉树------------\r\n\r\n";
return 0;
}
执行情况
**********************技术交流请 email:cuihao0532#163.com 欢迎转载,转载请注明出处!***************************** 如果对本文满意请扫描文章左侧【二维码添加微信】获取更多好玩、有趣、有益、有营养的料,
你我共同成长!Y(^_^)Y
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2013-05-05 【windows核心编程】第一章 错误处理