二叉树先序遍历 -- 递归和非递归实现
/*
*实现二叉树先序遍历 -- 采用递归和非递归方法,经调试可直接运行源码如下:
*/
#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 pre_order_traverse(BTreeNode *proot)
{
if (proot == NULL)
{
return;
}
cout << "递归遍历节点" << proot->elem << endl;//访问根节点
pre_order_traverse(proot->pleft);//左子树
pre_order_traverse(proot->pright);//右子树
return;
}
/*前序遍历 非递归实现*/
/*
第一步:首先判断proot是否为空,若不为空,则进行第二步;
若为空,则进行第三步。
第二步:访问proot,然后将proot入栈,将proot左结点赋给proot,
然后对新proot进行第一步。
第三步:判断栈是否为空,如果不为空,则取出栈顶元素,并出栈,
然后将栈顶元素的右结点赋给proot,然后进行第一步;
如果proot为NULL并且栈空,则结束。
第一步:如果proot为NULL并且栈空,则结束。
*/
/*先序非递归遍历*/
void pre_trvaverse(BTreeNode *proot)
{
if (proot == NULL)
{
return;
}
stack <BTreeNode*> st;
while (proot != NULL || !st.empty())
{
while (proot != NULL)
{
cout << "非递归遍历节点" <<proot->elem << endl;
st.push(proot);
proot = proot->pleft;
}
if (!st.empty())
{
proot = st.top();
st.pop();
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);
pre_trvaverse(bt);//非递归遍历
pre_order_traverse(bt);//递归遍历
system("pause");
return 0;
}
/*
运行结果:
a
b
#
#
c
#
#
----以上为输入
----以下为输出
非递归遍历节点a
非递归遍历节点b
非递归遍历节点c
递归遍历节点a
递归遍历节点b
递归遍历节点c
本例创建的二叉树形状:
a
b c
参考:
http://blog.csdn.net/beitiandijun/article/details/41926903
http://yuncode.net/code/c_505ea04f8f6186
*/
还没有评论,来说两句吧...