1. 程式人生 > >二叉樹的建立及相關操作

二叉樹的建立及相關操作

二叉樹是一種非常重要的資料儲存結構,是一種特殊的、常用的樹型資料結構,則其基本操作也就非常重要。因為二叉樹本身就是一個遞迴型資料儲存結構,所以其操作基本上都可以用遞迴的形式實現。
【二叉樹的建立】
要嚴格地進行輸入,要把所有結點的左右孩子都進行輸入,空結點用#代替(比如:ABC##DE#G##F###)。

typedef struct BiTNode {
	char date;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
void create(BiTree &T)
{
	char temp;
	cin >> temp;
	if (temp == '#')T = NULL;
	else
	{
		if (!(T = (BiTNode*)malloc(sizeof(BiTNode))))
		{
			cout << "記憶體已炸" << endl;
			return;
		}
		T->date = temp;
		create(T->lchild);
		create(T->rchild);
	}
}

【二叉樹的先序輸出遍歷】

void pretravl(BiTree T)//先序
{
	if (T != NULL)
	{
		cout << T->date;
		pretravl(T->lchild);
		pretravl(T->rchild);
	}
}

【二叉樹的中序輸出遍歷】

void medtravl(BiTree T)//中序
{
	if (T != NULL)
	{
		medtravl(T->lchild);
		cout << T->date;
		medtravl(T->rchild);
	}
}

【二叉樹的後序輸出遍歷】

void behtravl(BiTree T)//後序
{
	if (T != NULL)
	{
		behtravl(T->lchild);
		behtravl(T->rchild);
		cout << T->date;
	}
}

【二叉樹求深度】

int GetHeight(BiTree BT)
{
	int len1, len2;
	if (BT == NULL) return 0;
	len1 = GetHeight(BT->lchild);
	len2 = GetHeight(BT->rchild);
	if (len1 > len2) return len1 + 1;
	else return len2 + 1;
}

【二叉樹求葉子數】

   int TreeLeafSize(BiTNode* root)
{
	if (root == NULL)
		return 0;
	if (root->lchild == NULL && root->rchild == NULL)
		return 1;
	return TreeLeafSize(root->lchild) + TreeLeafSize(root->rchild);
}

可見以上函式的實現都是依靠遞迴實現的,遞迴方法較為簡潔,加上二叉樹本身的特性,實現起來較為簡單。不過還是有缺點的,執行較慢,消耗記憶體較大。有不對的地方還請多多指教。