二叉樹的特點:每個結點的度最大不能超過2,并且左右子樹不能顛倒
二叉樹的存儲結構:下面采用鏈式存儲進行闡述,堆排序算法(快速排序改進)采用的順序存儲結構的二叉樹,先看如下結構體的存儲方式
順序存儲:
鏈式存儲:
這里的TElemType的類型如下,這里我使用了int型的定義:
二叉樹的創建:這里需要進行遞歸創建,如下
printf("Please Enter BiTree Node data:/n");
scanf_s("%d", &nData);
if (nData == 0)
{
T = NULL;
return OK;
}
else if (nData > 0 && nData < 100)
{
T = (BiTNode*)malloc(sizeof(BiTNode));
if (!T)
{
return BTOVERFLOW;
}
T->data = nData;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
return OK;
}
#ifdef _DEBUG
printf("Enter data Error!/n");
#endif // _DEBUG
return ERROR;
}
這里我對數據進行了限制,便于進行測試,這里只接受0~100的數據,如果是0表明當前沒有孩子的節點(左孩子或者右孩子),如果存在就創建節點,填充數據
遍歷二叉樹:創建后之后,我必須測試創建的二叉樹中的數據是否正確,這里采用的是先根遍歷,如下
這里遍歷的時候采用了一個函數,注意傳遞的形參是函數指針,只是進行簡單的結點數據的輸出,如下:
但是在遍歷的時候,為什么T為NULL的時候,返回還是OK(1)呢,這里主要是上面的遍歷函數的原因,因為這里必須是先遍歷左孩子且返回值為真,才能遍歷右孩子,所以不能返回ERROR(0),感覺返回值有點怪,修改如下
這樣看著就舒服多了,其實可以不使用任何返回值,主要遍歷完左右子樹不用做其他任何事情,如果還有其他,就不能沒有返回值,這里return OK其實要不要也無所謂,因為我根本沒有進行判斷
測試用例:如下
這里對測試的數據輸入其實有一定的要求,假設根為12 孩子結點為 34 78,這里應該這樣輸入數據 12 34 0 0 78 0 0,只有這樣才能正常退出,如下測試結果:
Please Enter BiTree Node data:
12
Please Enter BiTree Node data:
34
Please Enter BiTree Node data:
0
Please Enter BiTree Node data:
0
Please Enter BiTree Node data:
78
Please Enter BiTree Node data:
0
Please Enter BiTree Node data:
0
12 34 78
從前面我可以看到這里采用的其實都是遞歸算法,我們都知道遞歸最大之弊病就是在每次下潛下一層的時候,一定要保存當前所在層次的數據,具體哪些數據其實是由操作系統OS來進行管理的,但是像每次的形參T一定會入棧,便于在層次退出返回上一層的時候使用,所以這里就可以采用非遞歸的方式的來進行修改算法:如何做呢?
新聞熱點
疑難解答
圖片精選