#include <iostream>
#include "stack"
using namespace std;
//二叉链表
typedef struct TreeNode
{
char cNode;
struct TreeNode *lc, *rc;
}TreeNode, *Bintree;
void PreOrder(Bintree T)
{
if (NULL == T)
{
return;
}
Bintree p = T;
stack<Bintree> s;
s.push(p); //根结点进栈
while (p||!s.empty()) //栈不为NULL,p不为空
{
p=s.top();
s.pop(); //根退栈
while (p)
{
printf("%c\n", p->cNode); //访问根结点
//如果节点有右孩子,结点进栈
if (p->rc)
{
s.push(p->rc);
}
p = p->lc; //再往左子树走
}
}
}
void main()
{
TreeNode t1, t2, t3, t4, t5, t6, t7, t8, t9;
memset(&t1, 0, sizeof(TreeNode));
memset(&t2, 0, sizeof(TreeNode));
memset(&t3, 0, sizeof(TreeNode));
memset(&t4, 0, sizeof(TreeNode));
memset(&t5, 0, sizeof(TreeNode));
memset(&t6, 0, sizeof(TreeNode));
memset(&t7, 0, sizeof(TreeNode));
memset(&t8, 0, sizeof(TreeNode));
memset(&t9, 0, sizeof(TreeNode));
t1.cNode = 'F';
t2.cNode = 'C';
t3.cNode = 'E';
t4.cNode = 'A';
t5.cNode = 'D';
t6.cNode = 'H';
t7.cNode = 'G';
t8.cNode = 'B';
t9.cNode = 'M';
t1.lc = &t2;
t1.rc = &t3;
t2.lc = &t4;
t2.rc = &t5;
t5.lc = &t8;
t3.lc = &t6;
t3.rc = &t7;
t7.lc = &t9;
//LevelorderEx(&t1);
PreOrder(&t1);
system("pause");
}
结果: FCADBEHGM
//中序遍历非递归
void Inorder(Bintree T)
{
if (NULL == T) return;
stack<Bintree> s; //初始化栈
Bintree p = T;
while (p||!s.empty()){
if (p){
s.push(p); //根指针进栈遍历左子树
p = p->lc; //每遇到非空二叉树先向左走
}
else{
p = s.top(); //根指针退栈,访问根结点
s.pop();
printf("%c\n", p->cNode); //访问根结点
p = p->rc; //向右子树走
}
}
}
结果:ACBDFHEMG