我們來了解一下二叉樹的遍歷,話不多說
二叉樹的遍歷的概念:
二叉樹有四種遍歷方式,分別為前序遍歷,中序遍歷,后序遍歷和層序遍歷,但我們今天談談前三種,并實現它
前序遍歷: 按照根,左子樹,右子樹的順序進行遍歷,方便記憶:根左右
中序遍歷: 按照左子樹,根,右子樹的順序進行遍歷,方便記憶:左根右
后序遍歷:?按照左子樹,右子樹,根的順序進行遍歷,方便記憶:左右根
注意:對于左右子樹,是相對于每個根結點來說的,遍歷時必須直到最后為空時,再往上返回
看了概念依然會有很多人不解(包括我),所以我們接下來來用中序遍歷的例子幫助我們更好地理解
根據中序遍歷的左根右的順序,和上圖的方向,我們可以寫出中序遍歷的順序結構形式了:
遞歸代碼實現:
創建二叉樹:
我們定義數據域和指針域,指針域為樹的左右結點
typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;//數據域struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;
前中后序遍歷:
我們通過中序遍歷發現當它往下調用完之后會往上返回,這符合遞歸的調用的方式
//前序遍歷--根左右
void PreOrder(BTNode* root)
{if (root == NULL)//遞歸函數的出口{printf("NULL ");return;}printf("%d ", root->data);PreOrder(root->left);PreOrder(root->right);
}
//中序遍歷--左根右
void MidOrder(BTNode* root)
{if (root == NULL)//遞歸函數的出口{printf("NULL ");return;}MidOrder(root->left);printf("%d ", root->data);MidOrder(root->right);
}
//后序遍歷--左右根
void AftOrder(BTNode* root)
{if (root == NULL)//遞歸函數的出口{printf("NULL ");return;}AftOrder(root->left);AftOrder(root->right);printf("%d ", root->data);
}