利用自己写的栈来遍历二叉树:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "LinkStack.h"
#define MYTURE 1
#define MYFLASE 0
//二叉树结点
typedef struct BINARYNODE{
char ch;
struct BINARYNODE* lchild;
struct BINARYNODE* rchild;
}BinaryNode;
//非递归遍历节点
typedef struct bin_tree_node
{
LinkNode node;
BinaryNode* root;
int flag;
}bin_tree_node; //因为要判断是不是要打印.所以要有个标记
void print_tree(BinaryNode* root)
{
if (root == NULL)
{
return;
}
printf("%c", root->ch);
print_tree(root->lchild);
print_tree(root->rchild);
}
bin_tree_node* creat_norecursion_node(BinaryNode* root,int flag)
{
bin_tree_node* tmp = (bin_tree_node*)malloc(sizeof(bin_tree_node));
tmp->root = root;
tmp->flag = flag;
return tmp;
}
void no_recursion(BinaryNode* root)
{
LinkStack* stack = Init_LinkStack();//用栈实现
Push_LinkStack(stack, (LinkNode*)creat_norecursion_node(root,MYFLASE));//先把根结点压栈
while (Size_LinkStack(stack) > 0)//刚开始栈里有根结点.所以一定不为空
{
bin_tree_node* tmproot = (bin_tree_node*)Top_LinkStack(stack);
Pop_LinkStack(stack);
//判断弹出结点是否为空
if (tmproot->root == NULL)
{
continue;
}
if (tmproot->flag == MYTURE)
{
printf("%c", tmproot->root->ch);
}
else
{
//更改结点状态并入栈
tmproot->flag = MYTURE;
Push_LinkStack(stack, (LinkNode*)tmproot);
//右节点入栈
Push_LinkStack(stack, (LinkNode*)creat_norecursion_node(tmproot->root->rchild, MYFLASE));
//左节点入栈
Push_LinkStack(stack, (LinkNode*)creat_norecursion_node(tmproot->root->lchild, MYFLASE));
}
}
}
void CresteBinaryTree(){
//创建结点
BinaryNode node1 = { 'A', NULL, NULL };
BinaryNode node2 = { 'B', NULL, NULL };
BinaryNode node3 = { 'C', NULL, NULL };
BinaryNode node4 = { 'D', NULL, NULL };
BinaryNode node5 = { 'E', NULL, NULL };
BinaryNode node6 = { 'F', NULL, NULL };
BinaryNode node7 = { 'G', NULL, NULL };
BinaryNode node8 = { 'H', NULL, NULL };
//建立结点关系
node1.lchild = &node2;
node1.rchild = &node6;
node2.rchild = &node3;
node3.lchild = &node4;
node3.rchild = &node5;
node6.rchild = &node7;
node7.lchild = &node8;
no_recursion(&node1);
print_tree(&node1);
}
int main(void)
{
CresteBinaryTree();
printf("\n");
system("pause");
return 0;
}