您的位置:首页 > 其它

二叉树中序遍历 -- 递归和非递归实现

2016-04-12 22:32 232 查看
/*   实现二叉树中序遍历 -- 采用递归和非递归方法
**   经调试可直接运行源码如下
**/

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <stack>

using namespace std;
/*二叉树结点定义*/
typedef struct BTreeNode
{
char elem;
struct BTreeNode *pleft;
struct BTreeNode *pright;
}BTreeNode;

/*
如果根节点为NULL,返回
根节点不为NULL,先访问左子树,再访问根节点,最后访问右子树
*/
/*中序遍历 递归实现*/
void mid_order_traverse(BTreeNode *proot)
{
if (proot == NULL)
{
return;
}

mid_order_traverse(proot->pleft);//左子树
cout << "递归遍历节点" << proot->elem << endl;//访问根节点
mid_order_traverse(proot->pright);//右子树

return;
}

/*中序遍历  非递归实现*/
/*
第一步:给定根节点proot,判断proot是否为空,如果不为空,然后进行第二步;
如果为空,则进行第三步;
第二步:将proot入栈,将proot的左结点赋给proot,然后进行第一步;
第三步:判断栈是否为空;如果为空,则结束,如果不为空,
则取出栈顶元素给proot,并出栈,访问proot,然后将proot的
右结点赋给proot,然后进行第一步。
*/
/*中序遍历非递归实现*/
void mid_trvaverse(BTreeNode *proot)
{
if (proot == NULL)
{
return;
}

stack <BTreeNode*> st;
while (proot != NULL || !st.empty())
{
while (proot != NULL)
{
st.push(proot);
proot = proot->pleft;
}

if (!st.empty())
{
proot = st.top();
st.pop();
cout << "非递归遍历节点" << proot->elem << endl;
proot = proot->pright;
}
}
return;
}

/*初始化二叉树根节点*/
BTreeNode* btree_init(BTreeNode *&bt)
{
bt = NULL;
return bt;
}
/*先序创建二叉树*/
void pre_crt_tree(BTreeNode* &bt)
{
char ch;
cin >> ch;
if (ch == '#')
{
bt = NULL;
}
else
{
bt = new BTreeNode;
bt->elem = ch;
pre_crt_tree(bt->pleft);
pre_crt_tree(bt->pright);
}
}

int main()
{
BTreeNode *bt;
btree_init(bt);//初始化根节点
pre_crt_tree(bt);//创建二叉树
mid_trvaverse(bt);//非递归遍历
mid_order_traverse(bt);//递归遍历

system("pause");
return 0;
}

/*
运行结果:
a
b
#
#
c
#
#

---以上为输入---
---以下为输出---

非递归遍历节点b
非递归遍历节点a
非递归遍历节点c
递归遍历节点b
递归遍历节点a
递归遍历节点c
请按任意键继续. . .

本例创建的二叉树形状:
a
b       c

参考资料: http://blog.csdn.net/beitiandijun/article/details/41926903 http://yuncode.net/code/c_505ea04f8f6186
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: