理论原理:
代码实现:
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
struct Binary_Tree_Node
{
char data;
Binary_Tree_Node *lchild;
Binary_Tree_Node *rchild;
Binary_Tree_Node(char data,Binary_Tree_Node *lchild,Binary_Tree_Node *rchild);
};
Binary_Tree_Node::Binary_Tree_Node(char data,Binary_Tree_Node *lchild,Binary_Tree_Node *rchild)
{
this->data=data;
this->lchild=lchild;
this->rchild=rchild;
}
struct Stack_Node
{
Binary_Tree_Node *node;
bool flag;
};
Stack_Node* createNode(Binary_Tree_Node *node,bool flag)
{
Stack_Node* newnode=new Stack_Node;
newnode->node=node;
newnode->flag=flag;
return newnode;
}
static stack<Stack_Node*> myStack;
void NoRecursion()
{
while (!myStack.empty()) {
//取出栈顶元素
Stack_Node *root=myStack.top();
myStack.pop();
if(root->node==NULL)
{
continue;
}
if(root->flag)
{
//直接输出
cout<<root->node->data;
//释放结点
delete root;
}
else
{
//先将root的flag置为true
root->flag=true;
//转换顺序可以分别实现先序,后序,中序遍历
//右结点进栈
myStack.push(createNode(root->node->rchild,false));
//左结点进栈
myStack.push(createNode(root->node->lchild,false));
//根结点进栈
myStack.push(root);
}
}
}
int main()
{
//创建结点
Binary_Tree_Node nodeA('A',NULL,NULL);
Binary_Tree_Node nodeB('B',NULL,NULL);
Binary_Tree_Node nodeC('C',NULL,NULL);
Binary_Tree_Node nodeD('D',NULL,NULL);
Binary_Tree_Node nodeE('E',NULL,NULL);
Binary_Tree_Node nodeF('F',NULL,NULL);
Binary_Tree_Node nodeG('G',NULL,NULL);
Binary_Tree_Node nodeH('H',NULL,NULL);
//创建树
nodeA.lchild=&nodeB;
nodeA.rchild=&nodeF;
nodeB.rchild=&nodeC;
nodeC.lchild=&nodeD;
nodeC.rchild=&nodeE;
nodeF.rchild=&nodeG;
nodeG.lchild=&nodeH;
myStack.push(createNode(&nodeA,false));
NoRecursion();
return 0;
}
运行结果: