1. 程式人生 > 其它 >二叉樹基本操作程式碼實現

二叉樹基本操作程式碼實現

#include <stdio.h>
#include <stdlib.h> //exit
#include<malloc.h>
//定義二叉連結串列結點結構
typedef struct node{
	int   data;
	struct node  *lchild, *rchild;
}BiTree;
//建立二叉連結串列
BiTree  *CreateBiTree( )
{  
	BiTree  *T;	
	int  x;  
    scanf("%d",&x);
    if(x==0)  T=NULL;
    else 
    {  
		if(!(T=(BiTree*)malloc(sizeof(BiTree))))         
             exit(-1);
        T->data = x;
        T->lchild =CreateBiTree();
        T->rchild =CreateBiTree();
    }
    return T;
}
//先序遍歷二叉樹
void  Preorder(BiTree  *T )  
{
	if(T)  
	{
		printf("%d",T->data); 
		Preorder( T->lchild );
		Preorder( T->rchild );
	}
}
//中序遍歷二叉樹
void  Inorder(BiTree  *T )  
{
	if(T)  
	{
		Inorder( T->lchild );
		printf("%d",T->data); 
		Inorder( T->rchild );
	}
}
//後序遍歷二叉樹
void  Postorder(BiTree  *T )  
{
	if(T)  
	{
		Postorder( T->lchild );
		Postorder( T->rchild );
		printf("%d",T->data); 
	}
}
//計算二叉樹的深度
int Depth(BiTree *T)
{   int depl,depr;
    if(T)
    {
	  depl=Depth(T->lchild);
	  depr=Depth(T->rchild);
	  if (depl>=depr) return (depl+1);
	  else return (depr+1);
    }
    else  return 0;
}
//求二叉樹結點的個數
int Total(BiTree   *T)
{  
	int  left,right;
    if (T==NULL) return 0;
    left= Total(T->lchild);
    right= Total(T->rchild);
    return 1+left+right;
}
//求結點的雙親結點
int Parent(BiTree  *T,int x)
{ //若返回值為0,則結點不在樹中
  //若返回值為1,則找到雙親結點
    if(T)
    {
		if(T->data ==x) 
		{
			printf("該結點為樹跟,不存在雙親");
			return 0;
		}
		else if(T->lchild&&T->lchild->data==x||T->rchild&&T->rchild->data==x)
		{
			printf("該結點為的雙親%d",T->data);
			return 1;
		}
		else
		{
			if(Parent(T->lchild, x))
				return 1;
			else
				return Parent(T->rchild, x);
		}
	}
	else return 0;
}
//判定結點所在的層次
int Level(BiTree  *T,int x,int n)
{//若返回值為0,則結點不在樹中,否則返回結點的層次
	int lev;
	if(T)
	{
		if(T->data==x) return n;
		lev=Level(T->lchild,x,n+1);
		if(lev)
			return lev;
		else
			return Level(T->rchild,x,n+1);
	}
	else return 0; 
}

void freeTree(BiTree   *T)
{
	BiTree  *ltree,*rtree;
	if(T)
	{
		ltree=T->lchild;
		rtree=T->rchild;
		free(T);
		freeTree(ltree);
		freeTree(rtree);
	}
}


void main()
{
	int sel;
	BiTree   *T;
	int x;
	do{
		printf("┌─────────────────┐\n");
		printf("︳  二叉樹的基本操作(二叉連結串列實現)  ︳\n");
		printf("︳                                  ︳\n");
		printf("︳  1  建立      2、先序遍歷        ︳\n");
		printf("︳  3、中序遍歷  4、後序遍歷        ︳\n");
		printf("︳  5、深度      6、結點個數        ︳\n");
		printf("︳  7、求雙親    8、結點層次        ︳\n");
		printf("︳  9、退出                         ︳\n");
		printf("└─────────────────┘\n");
		printf("請選擇:");
		scanf("%d",&sel);
		switch(sel)
		{
		case 1: 
			printf("\n請輸入二叉樹中的結點:\n");
			T=CreateBiTree();
			break;
		case 2:
			printf("\n先序遍歷序列:\n");
			Preorder(T );
			break;
		case 3:
			printf("\n中序遍歷序列:\n");
			Inorder(T );
			break;
		case 4:
			printf("\n後序遍歷序列:\n");
			Postorder(T );
			break;
		case 5:
			printf("\n二叉樹的深度為:%d\n",Depth(T));
			break;
		case 6:
			printf("\n二叉樹中結點總數為:%d\n",Total(T));
			break;
		case 7:
			printf("\n請輸入一個結點:\n");
			scanf("%d",&x);
			if(!Parent(T,x)) printf("\n未找到雙親");
			break;
		case 8:
			printf("\n請輸入一個結點:\n");
			scanf("%d",&x);
			printf("\n該結點層次為:%d\n",Level(T,x,1));
			break;
		case 9:
			freeTree(T);
			return;
		}
		printf("\n按任意鍵繼續....\n");
		getch();
		system("cls");
	}while(1);
	//釋放連結串列
}

//測試資料: 
//1 2 3 0 0 4 5 0 6 0 0 7 0 0 0