#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max_size 20 //person姓名的大小
#define my_false 0
#define my_true 1
//棧
typedef struct StackNode
{
struct StackNode* next;
}StackNode;
typedef struct StackList
{
StackNode top; //指向棧頂的指針
int count;
}StackList;
StackList* init_stack()
{
StackList * stack = (StackList*)malloc(sizeof(StackList));
stack->count = 0;
stack->top.next = NULL;
return stack;
}
void push_stack(StackList* stack , StackNode* data) //入棧
{
if(data == NULL)
{
return;
}
data->next = stack->top.next;
stack->top.next = data;
stack->count++;
}
void pop_stack(StackList* stack) //出棧
{
if(stack == NULL)
{
return;
}
stack->top.next = stack->top.next->next;
stack->count--;
}
StackNode* top_stack(StackList* stack)
{
if(stack == NULL)
{
return NULL;
}
return stack->top.next;
}
//測試棧
typedef struct person
{
StackNode node;
char name[max_size];
int age;
}Person;
//打印
void My_print(StackNode* data)
{
person* p = (person*)data;
printf("%s %d\n" , p->name ,p->age);
}
//**********************************************************************************//
//二叉樹
typedef struct BTNODE
{
char ch;
struct BTNODE* Lchild;
struct BTNODE* Rchild;
}BTNode;
//因爲棧是企業鏈表的形式,所以對二叉樹進行封裝
typedef struct BTNode_stack
{
StackNode node;
BTNode* root; //二叉樹的根節點
int flag; //用來表示true 和 flase
}BTNode_stack;
//創建結點
BTNode_stack* createBTNode_stack(BTNode* root ,int flag)
{
BTNode_stack* newnode = (BTNode_stack*)malloc(sizeof(BTNode_stack));
newnode->root = root;
newnode->flag = flag;
return newnode;
}
//二叉樹的非遞歸遍歷
void NonRecursion(BTNode* root)
{
StackList* stack = init_stack();
push_stack(stack,(StackNode*)createBTNode_stack(root,my_false)); //入棧
while(stack->count > 0)
{
BTNode_stack* node = (BTNode_stack*)top_stack(stack); //返回棧頂元素
pop_stack(stack); //出棧
//判斷彈出的樹結點是否爲空
if(node->root == NULL)
{
continue;
}
if(node->flag == my_true)
{
printf("%c ",node->root->ch);
}
else
{
push_stack (stack,(StackNode*)createBTNode_stack( node->root->Rchild ,my_false ));
push_stack (stack,(StackNode*)createBTNode_stack( node->root->Lchild ,my_false ));
node->flag = my_true;
push_stack (stack,(StackNode*)node);
}
}
}
//二叉樹的遞歸遍歷
void Recursion(BTNode* root) //根結點
{
if(root == NULL)
{
return;
}
printf("%c ",root->ch);
//遞歸遍歷
Recursion(root->Lchild);
Recursion(root->Rchild);
}
//創建樹 A,B,C,D,E,F,G,H
void CreateBinaryTree()
{
//創建結點
BTNode node1 = {'A' ,NULL ,NULL };
BTNode node2 = {'B' ,NULL ,NULL };
BTNode node3 = {'C' ,NULL ,NULL };
BTNode node4 = {'D' ,NULL ,NULL };
BTNode node5 = {'E' ,NULL ,NULL };
BTNode node6 = {'F' ,NULL ,NULL };
BTNode node7 = {'G' ,NULL ,NULL };
BTNode node8 = {'H' ,NULL ,NULL };
//建立關係
node1.Lchild = &node2;
node1.Rchild = &node6;
node2.Rchild = &node3;
node3.Lchild = &node4;
node3.Rchild = &node5;
node6.Lchild = &node7;
node7.Lchild = &node8;
//非遞歸打印
NonRecursion(&node1);
printf("\n");
//遞歸打印
Recursion(&node1);
}
int main()
{
CreateBinaryTree();
printf("\n");
//測試棧 與二叉樹非遞歸遍歷無關
StackList* stack = init_stack();
person p1 = { NULL ,"aaa",20 };
person p2 = { NULL ,"bbb",21 };
person p3 = { NULL ,"ccc",22 };
push_stack(stack,(StackNode*)&p1);
push_stack(stack,(StackNode*)&p2);
push_stack(stack,(StackNode*)&p3);
while(stack->count>0)
{
My_print(top_stack(stack));
pop_stack(stack);
}
}
二叉樹的非遞歸遍歷與遞歸打印 先序遍歷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.