樹的遍歷
想要訪問二叉樹中的節點需要遍歷整棵樹。通常有三種遍歷樹的形式,每種遍歷形式產生不同順序的元素。
中序遍歷(Left-Root-Right)
中序遍歷首先訪問左子節點,然後訪問根節點,最後再訪問右子節點。遞歸重複此操作,直到遍歷完樹中的所有元素。
中序遍歷算法步驟
- 遍歷左子樹,中序遞歸調用(左子樹)
- 訪問根結點
- 遍歷右子樹,中序遞歸調用(右子樹)
中序遍歷代碼
void inorder(struct Node* node){
if (node==NULL)return;
inorder(node->left);
cout<<node-data<<endl;
inorder(node->right);
}
前序遍歷(Root-Left-Right)
在前序遍歷中,首先訪問根節點,然後訪問左節點,最後訪問右節點。重複執行遞歸,直到所有節點都被遍歷。
前序遍歷算法步驟
- 訪問根節點
- 遍歷左子樹,前序遞歸調用(左子樹)
- 遍歷右子樹,前序遞歸調用(右子樹)
前序遍歷代碼
void preorder(struct Node* node){
if (node==NULL)return;
cout<<node->data<<endl;
preorder(node->left);
preorder(node->right);
}
後序遍歷(Left-Right-Root)
後序遍歷首先訪問左子節點,然後訪問右子節點,最後訪問根節點。遞歸重複此操作,直到樹中的每個元素都被訪問。
後序遍歷算法步驟
- 遍歷左子樹,後序遞歸調用(左子樹)
- 遍歷右子樹,後序遞歸調用(右子樹)
- 訪問根節點
後序遍歷代碼
void postorder(struct Node* node){
if (node==NULL)return;
postorder(node->left);
postorder(node->right);
}
算法時間複雜度
每棵樹的遍歷的時間複雜度均爲O(n),遍歷樹所需時間隨元素線性增加
更多內容,歡迎訪問: