1. 程式人生 > >《演算法導論》第12章 二叉查詢樹 (1)遍歷

《演算法導論》第12章 二叉查詢樹 (1)遍歷

二叉查詢樹的效率 在二叉查詢樹中執行的基本操作的時間與樹的高度成正比。最壞情況, 樹的高度是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;
               
     }
}