二叉樹的非遞歸遍歷與遞歸打印 先序遍歷

#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);
	} 
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章