1. 程式人生 > >二叉樹結點深度(C語言)

二叉樹結點深度(C語言)

  在每個結點中儲存其深度。在二叉樹的建立和遍歷過程中可以發現,每次呼叫函式的時候都是前往左子樹或者右子樹,這個時候所前往的結點的深度都會增加一個,而當函式呼叫完成的時候會退出函式棧在此函式中的結點深度就會減少一個。因此可以設定一個全域性變數deep來表示當前函式中的結點的深度,在建立二叉樹的函式開頭深度加1,當函式呼叫結束退棧前再將深度減1.

如下圖所示的二叉樹

下面是程式碼

#include<stdio.h>
#include<stdlib.h>
int deep=0;//在遍歷樹的過程中表示當前深度。
struct bitree
{
	char data;
	struct bitree* lchild;
	struct bitree* rchild;
	int deepth;
};//儲存結點資訊,指向左右子樹的指標,以及該結點深度。
struct bitree* precreat(struct bitree* t)
{
		char ch;
	    scanf("%c",&ch);
		deep++;//每次呼叫函式深度+1.
	    if(ch==' ')t=NULL;
	    else
		{
		    if(!(t=(struct bitree*)malloc(sizeof(struct bitree))))exit(0);
		    t->data=ch;
		    t->lchild=precreat(t->lchild);
		    t->rchild=precreat(t->rchild);
			t->deepth=deep;
		}
		deep--;//函式呼叫完退棧深度—1.
		return t;
}//先序建立二叉樹。
void preordertraverse(struct bitree* t)
{
	if(t)
	{
		printf("%c 深度:%d\n",t->data,t->deepth);
		preordertraverse(t->lchild);
		preordertraverse(t->rchild);
	}
}//先序遍歷二叉樹。

int main()
{
	struct bitree* t;
	printf("請輸入您要建立的先序樹:");
	t=precreat(t);
	printf("對此樹先序遍歷的結果:\n");
    preordertraverse(t);
	return 0;
}

下面是上圖所示二叉樹執行結果