1. 程式人生 > >資料結構——樹的簡單操作

資料結構——樹的簡單操作

//樹的實現
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct node{
	int data;
	struct node* left;
	struct node* right;
}treeNode;

//初始化佇列
typedef struct QueueNode{
	struct treeNode* n;
	struct QueueNode* next;
}QueueNode;


int Max=100;//深度
char *p;
//訪問結點資料
void VisitNode(treeNode* n){
	printf("%d ",n->data);
}

//先序遍歷
void PreOrder(treeNode* n){
	if(n!=NULL){
		VisitNode(n);
		PreOrder(n->left);
		PreOrder(n->right);
	}
}

//後序遍歷
void PostOrder(treeNode* n){
	if(n!=NULL){
		PostOrder(n->left);
		PostOrder(n->right);
		VisitNode(n);
	}
}

//中序遍歷
void InOrder(treeNode* n){
	if(n!=NULL){
		InOrder(n->left);
		VisitNode(n);
		InOrder(n->right);
		
	}
}
//求深度

void DeepTree(treeNode* n,int m){
	if(n!=NULL){
		m++;
		if(Max<m)
			Max=m;
		DeepTree(n->left,m);
		DeepTree(n->right,m);
	}
}

//樹的層次遍歷
void LevelOrder(treeNode* n){
	treeNode list[50],m;//list佇列
	int top,base;
	top=0;
	base=0;
	list[top++]=*n;		//根結點入隊
	while(top!=base){
		//入隊list[top]的左右結點
		m=list[base];
		if(m.left)
			list[top++]=*m.left;
		if(m.right)
			list[top++]=*m.right;
		//出隊
		base++;
		VisitNode(&m);
	}
}


//入隊
void DeQueue(QueueNode** Rear,treeNode** n){
	QueueNode* m=(QueueNode*)malloc(sizeof(QueueNode));
	(*n)->left=NULL;
	(*n)->right=NULL;
	m->n=*n;
	m->next=NULL;
	(*Rear)->next=m;
	(*Rear)=m;
}

//出隊
treeNode* ExQueue(QueueNode* front){
	QueueNode* m=front->next;
	front->next=m->next;
	return m->n;
}

//判空
int IsEmptyQueue(QueueNode* Rear,QueueNode* front){
	return Rear==front?1:0;
}



//生成二叉樹(層序)
void LevelInput(treeNode* tree){
	//例項化佇列
	QueueNode* Queue;
	QueueNode* Rear;
	char a[50];
	int i=0;
	//頭尾指標指向頭結點
	Queue=Rear=(QueueNode*)malloc(sizeof(QueueNode));
	gets(a);
	//根結點入隊
	tree->data=a[i++]-48;
	DeQueue(&Rear,&tree);
	if(Queue->next==NULL){
		//空佇列
		Queue->next=Rear;
	}
	while(i!=strlen(a)){
		//上一個結點出隊
		treeNode* r=ExQueue(Queue);
		//申請結點
		treeNode* mleft=(treeNode*)malloc(sizeof(treeNode));
		treeNode* mright=(treeNode*)malloc(sizeof(treeNode));
		//左結點操作
		if(a[i]!='#'){
			mleft->data=a[i++]-48;
			//結點拼接
			r->left=mleft;
			//mleft結點入隊
			DeQueue(&Rear,&mleft);
			if(Queue->next==NULL){
				//空佇列
				Queue->next=Rear;
			}
		}
		else{
			r->left=NULL;
			i++;
		}

		if(i==strlen(a)){
			continue;
		}

		//右結點操作
		if(a[i]!='#'){
			mright->data=a[i++]-48;
			//結點拼接
			r->right=mright;
			//mright結點入隊
			DeQueue(&Rear,&mright);
			if(Queue->next==NULL){
				//空佇列
				Queue->next=Rear;
			}
		}
		else{
			r->right=NULL;
			i++;
		}
	}
}
//生成二叉樹(先序)
treeNode* PreInput(){
    treeNode* temp;
    while(*p==' ')p++;//去掉空格
    if(*p=='#'){
        p++;
		return NULL;
    }
    if(*p!='\0'){
        temp = (treeNode *)malloc(sizeof(treeNode));
        temp->data=*p++-48;
        temp->left=PreInput();
        temp->right=PreInput();
	}
	return temp;
	
}

void test1(){
	//先序
	treeNode * head;
	char str[50];p=str;
	gets(str);
    if(*p!='\0'&&*p!=' '&&*p!='#'){
		head=(treeNode *)malloc(sizeof(treeNode));
		head->data=*p++-48;
        head->left=PreInput();
        head->right=PreInput();
	}
	printf("\n");
	LevelOrder(head);
}
void test2()
{
	//層序
	treeNode* tree;
	
	tree=(treeNode*)malloc(sizeof(treeNode));
	LevelInput(tree);
	LevelOrder(tree);
	printf("\n");
}