《演算法導論》第12章 二叉查詢樹 (1)遍歷
阿新 • • 發佈:2019-01-26
二叉查詢樹的效率
在二叉查詢樹中執行的基本操作的時間與樹的高度成正比。最壞情況,
樹的高度是N,像連結串列一樣,而較好情況高度是lgN。因此,樹的高度是關鍵。
下一章將要學習的紅黑樹是對二叉查詢樹的改進,通過保持樹的高度從而
保證紅黑樹上的操作有很好的效率。
各種遍歷演算法
中序遍歷演算法:子樹根的關鍵字在輸出時介於左子樹和右子樹的關鍵字之間。
即按排列順序輸出樹中的所有關鍵字。
相應的,前序遍歷就是子樹根的關鍵字在左右子樹之前輸出。
在後面的基數樹中,前序遍歷(而非中序遍歷)是二進位制串的排序輸出。
用遞迴方式可以很輕鬆地實現二叉樹的遍歷。
非遞迴實現中序遍歷 沿著二叉樹的最左結點遍歷,逐個入棧,到最左結點後開始出棧。 列印彈出棧的結點的值,並以該結點的右孩子為根結點,繼續沿其最左結點處理。
// 包含衛星資料的二叉樹結點定義 struct _BSTNode { struct _BSTNode *parent, *left, *right; int key; char *value; }; typedef struct _BSTNode BSTNode; // 中序遍歷 void bst_inorder_walk(BSTNode *node) { if (node != NULL) { bst_inorder_walk(node->left); printf("key: %d, val: %s\n", node->key, node->value); bst_inorder_walk(node->right); } }
非遞迴實現中序遍歷 沿著二叉樹的最左結點遍歷,逐個入棧,到最左結點後開始出棧。 列印彈出棧的結點的值,並以該結點的右孩子為根結點,繼續沿其最左結點處理。
void bst_inorder_walk(BSTNode *node) { BSTNode *stack[20]; int top = 0; while (node || top != 0) { // Push most-left children to stack while (node) { stack[top++] = node; node = node->left; } // Print and continue to handle right child node = stack[--top]; printf("%d, %s\n", node->key, node->value); node = node->right; } }