1. 程式人生 > >二叉樹的建立與遍歷(先序,中序,後序,層次)

二叉樹的建立與遍歷(先序,中序,後序,層次)

#include<stdio.h>
#include<stdlib.h>

typedef struct BitNode
{
	char data;
	struct BitNode *lchild,*rchild;
}BitNode;



BitNode* CreateBiT()                           //建立二叉樹 
{
	char ch;
	BitNode *T;
	scanf("%c",&ch);
	if(ch == ' ')    T = NULL;
	else{
		T = (BitNode*)malloc(sizeof(BitNode));
		T->data = ch;
		T->lchild = CreateBiT();
		T->rchild = CreateBiT();
	}
	return T;	
}

void Preorder (BitNode *T)								//先序遍歷 
{
	if(T)
	{
		printf("%c",T->data);
		Preorder(T->lchild);
		Preorder(T->rchild);
	}
	else return;
}

void Infixorder (BitNode *T)								//中序遍歷 
{
	if(T)
	{
		Infixorder(T->lchild);
		printf("%c",T->data);
		Infixorder(T->rchild);
	}
	else return;
}

void Epilogue (BitNode *T)							//後序遍歷 
{
	if(T)
	{
		Epilogue(T->lchild);
		Epilogue(T->rchild);
		printf("%c",T->data);
		
	}
	else return;
}

void levelOrder(BitNode *T)            //利用佇列層次遍歷 
{
	BitNode *Q[100];
	int rear,front;
	BitNode *p;
	rear = front = 0;
	Q[rear] = T;
	rear = (rear+1)%100;
	while((rear+1)%100 != front)
	{
		p = Q[front];
		printf("%c",p->data);
		front = (front+1)%100;
		if(p->lchild)
		{
			Q[rear] = p->lchild;
			rear = (rear+1)%100;
		}
		if(p->rchild)
		{
			Q[rear] = p->rchild;
			rear = (rear+1)%100;
		}
	}
}



int main()
{
	BitNode *T;
	printf("請輸入節點的value(在一行輸入):");
	T = CreateBiT();
	printf("\n先序:");
	Preorder (T);
		printf("\n中序:");
	Infixorder(T);
		printf("\n後序:");
	Epilogue(T);
		printf("\n層次:");
	levelOrder(T);
	return 0;
}