1. 程式人生 > >二叉樹的建立與遍歷(c語言實現)

二叉樹的建立與遍歷(c語言實現)

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

typedef int ElemType;	//這裡用int 作為樹結點的資料

typedef struct BiTNode
{
	ElemType data;
	struct  BiTNode *lchild, *rchild;	//左右孩子指標
}BiTNode, *BiTree;

void createBiTree(BiTree *T);		//建立樹
void preOrderTraverse(BiTree T);	//前序遍歷
void inOrderTraverse(BiTree T);		//中序遍歷
void postOrderTraverse(BiTree T);	//後序遍歷

int main()
{
	BiTree T = NULL;
	createBiTree(&T);
	preOrderTraverse(T);
	printf("\n");
	inOrderTraverse(T);
	printf("\n");
	postOrderTraverse(T);
	return 0;
}

void createBiTree(BiTree *T)
{
	ElemType ch;
	scanf ("%d", &ch);	//如果是字元型 %c 回車輸入 算一個字元,ubutun會一直遞迴
	if (0 == ch)            //擴充套件二叉樹,虛結點 == 0
	{
		*T = NULL;
	}
	else
	{
		*T = (BiTree)malloc(sizeof(BiTNode));	//!!! stdlib.h 標頭檔案一定要加!!!
		if (!*T)
		{
			exit(1);	//錯誤退出
		}
		(*T)->data = ch;	//生成根結點
		createBiTree(&((*T)->lchild));	//構造左子樹
		createBiTree(&((*T)->rchild));	//構造右子樹
	}
}

void preOrderTraverse(BiTree T)
{
	if (NULL == T)
	{
		return;
	}
	printf("%d", T->data);	//顯示結點資料,可以改成其他對結點的操作
	preOrderTraverse(T->lchild);	//再先序遍歷左子樹
	preOrderTraverse(T->rchild);	//最後先序遍歷右子樹
}

void inOrderTraverse(BiTree T)
{
	if (NULL == T)
	{
		return;
	}
	inOrderTraverse(T->lchild);	//中序遍歷左子樹
	printf("%d", T->data);			//顯示結點資料,可以改成其他對結點的操作
	inOrderTraverse(T->rchild);	//最後再中序遍歷右子樹
}

void postOrderTraverse(BiTree T)
{
	if (NULL == T)
	{
		return;
	}
	postOrderTraverse(T->lchild);	//先後序遍歷左子樹
	postOrderTraverse(T->rchild);	//再後序遍歷右子樹
	printf("%d", T->data);			//顯示結點資料,可以改成其他對結點的操作
}

執行結果:依次輸入120400300