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

《演算法導論》第12章 二叉查詢樹 (3)基數樹


基數樹與二叉查詢樹和Trie樹很相似。它像BST一樣是二叉的,向左表示0而不是BST的小於,
而向右則表示1而不是大於。它像Trie一樣共享相同的結點來儲存字串中相同的字首,從而 節省了空間,但它不像Trie那樣每個結點有很多孩子(可以是26個,表示a到z),它用來處理 只包含0和1的字串。
基數樹和Trie都用來儲存和排列字串,那麼現在來看看字典序,關於字典序有兩條規則: 1. 字串長度相同時,從左向右逐個字元比較。如011 < 100。 2. 字串長度不同時,長度長的在字典序中值更大。如100 < 1011。 因此,根結點 < 左子樹結點 < 右子樹結點。
#include <stdio.h>
#include <stdlib.h>

typedef struct RadixNode {
     struct RadixNode *lchild, *rchild;
     char *str;
} RadixNode;

void radix_insert(RadixNode *node, char *str)
{
     int i;
     for (i = 0; str[i] != '\0'; i++) {               
          if (str[i] == '0') {
               if (node->lchild == NULL)
                    node->lchild = calloc(sizeof(RadixNode), 1);
               node = node->lchild;               
          } 
          else {
               if (node->rchild == NULL)
                    node->rchild = calloc(sizeof(RadixNode), 1);
               node = node->rchild;
          }               
     }
     node->str = str;
}

void radix_preorder_walk(RadixNode *node)
{
     if (node != NULL) {
          if (node->str != NULL)
               printf("%s\n", node->str);
          radix_preorder_walk(node->lchild);
          radix_preorder_walk(node->rchild);
     }
}

int main(void)
{
     RadixNode *root = malloc(sizeof(RadixNode));
     radix_insert(root, "1011");
     radix_insert(root, "10");
     radix_insert(root, "011");
     radix_insert(root, "100");
     radix_insert(root, "0");
     
     radix_preorder_walk(root);

     return 1;
}

相關推薦

演算法導論12 查詢 (3)基數

基數樹與二叉查詢樹和Trie樹很相似。它像BST一樣是二叉的,向左表示0而不是BST的小於, 而向右則表示1而不是大於。它像Trie一樣共享相同的結點來儲存字串中相同的字首,從而 節省了空間,但它不

演算法導論12 查詢 (1)遍歷

二叉查詢樹的效率 在二叉查詢樹中執行的基本操作的時間與樹的高度成正比。最壞情況, 樹的高度是N,像連結串列一樣,而較好情況高度是lgN。因此,樹的高度是關鍵。 下一章將要學習的紅黑樹是對二叉查詢

演算法導論(12) 查詢

12.1 二叉查詢樹 定義:設x為二叉查詢樹中的一個結點。如果y是x的左子樹中的一個結點,則key[y]≤key[x]。如果y是x的右子樹中的一個結點,則key[x]≤key[y]. 前序遍歷:先遍歷根再遍歷左右子樹,簡稱根-左-右。 中序遍歷:先遍歷左子樹再遍歷根再遍歷右

演算法導論12搜尋

基本性質 左子樹 < 根 < 右子樹 基本操作 O(logn) 1.查詢最大、最小關鍵字元素 根據二叉樹的基本性質,向左子樹或右子樹遞迴即可 2.查詢前驅和後繼 查詢結點X的後繼Y分為兩種情況: ①右結點存在,即只需要找到右子樹中最小的元素就好

演算法班筆記 和基於的DFS

第五章 二叉樹和基於樹的DFS 在這一章節的學習中,我們將要學習一個數據結構——二叉樹(Binary Tree),和基於二叉樹上的搜尋演算法。 在二叉樹的搜尋中,我們主要使用了分治法(Divide Conquer)來解決大部分的問題。之所以大部分二叉樹的問題可以使用分治法

查詢演算法 淺談演算法和資料結構: 七 查詢 淺談演算法和資料結構: 十一 雜湊表

閱讀目錄 1. 順序查詢 2. 二分查詢 3. 插值查詢 4. 斐波那契查詢 5. 樹表查詢 6. 分塊查詢 7. 雜湊查詢   查詢是在大量的資訊中尋找一個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。本文

演算法導論 十三:紅黑 筆記(紅黑的性質、旋轉、插入、刪除)

紅黑樹(red-black tree) 是許多“平衡的”查詢樹中的一種,它能保證在最壞情況下,基本的動態集合操作的時間為O(lgn) 。 紅黑樹的性質: 紅黑樹是一種二叉查詢樹,但在每個結點上增加一個儲存位表示結點的顏色,可以是RED或BLACK 。通過對任何一條從根到葉子的路徑上各個結

演算法導論 :快速排序 筆記(快速排序的描述、快速排序的效能、快速排序的隨機化版本、快速排序分析)

快速排序的最壞情況時間複雜度為Θ(n^2)。雖然最壞情況時間複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能很好。它的期望執行時間複雜度為Θ(n lg n),而且Θ(n lg n)中蘊含的常數因子非常小,而且它還是原址排序的。 快速排序是一種排序演算法,對包含n個數的

演算法導論 :堆排序 筆記(堆、維護堆的性質、建堆、堆排序演算法、優先順序佇列、堆排序的程式碼實現)

堆排序(heapsort) 像合併排序而不像插入順序,堆排序的執行時間為O(nlgn) 。像插入排序而不像合併排序,它是一種原地( in place) 排序演算法:在任何時候,陣列中只有常數個元素儲存在輸入陣列以外。 堆: (二叉)堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。樹

演算法導論 :概率分析和隨機演算法 筆記(僱傭問題、指示器隨機變數、隨機演算法、概率分析和指示器隨機變數的進一步使用)

僱傭問題: 假設你需要僱用一名新的辦公室助理。你先前的僱傭嘗試都以失敗告終,所以你決定找一個僱用代理。僱用代理每天給你推薦一個應聘者。你會面試這個人,然後決定要不要僱用他。你必須付給僱用代理一小筆費用來面試應聘者。要真正地僱用一個應聘者則要花更多的錢,因為你必須辭掉目前的辦公室助理,還要付一

演算法導論 :遞迴式 筆記(代換法、遞迴方法、主方法、主定理的證明)

三種解遞迴式的方法:代換法、遞迴樹方法、主方法。 代換法: 用代換法解遞迴式需要兩個步驟: 猜測解的形式; 用數學歸納法找出使解真正有效的常數。 如: T(n) = 2T(n/2) + n,這個是合併排序的執行時間的遞迴表示式。歸併排序法的執行時間是O(nlgn),那麼我

演算法導論 :函式的增長 筆記(Θ記號、O記號、Ω記號、o記號、ω記號、漸近記號的性質、標準記號與常用函式)

Θ記號: 該記號圓圈中是個M。Θ記號漸近地給出一個函式的上界和下界。 對於一個給定的函式g(n),我們用Θ(g(n))來表示以下函式的集合: Θ(g(n))={f(n):存在正常量c1、c2和n0,使得對於所有n⩾n0,有0⩽c1g(n)⩽f(n)⩽c2g(n)}。 即若存在正常

2018/11/29 演算法時空(2) 演算法導論 函式的增長

漸進記號:   O記號:   歐米茄記號: 注意: O記號是複雜度函式的上限, 歐米茄記號是複雜度函式的下限. 等式/不等式漸進記號:  極限的定義: 通過極限的方法, 來求複雜度函式.   當極限的值是一個大於零

【學習筆記】演算法導論2演算法基礎

//====================================== //Ch2_1_Basic_Sort_Algorthm //====================================== #include<iostream> #

演算法導論 13 紅黑(圖文詳細解說)

1、二叉查詢樹的不足 二叉查詢樹的基本操作包括搜尋、插入、刪除、取最大和最小值等都能夠在O(h)(h為樹的高度)時間複雜度內實現,因此能在期望時間O(lgn)下實現,但是二叉查詢樹的平衡性在這些操作中並沒有得到維護,其高度可能會變得很高,當其高度較高時,二叉查詢樹的效能就未

演算法導論 10 10.2 連結串列

一、概念 (1)陣列的線性序是由陣列的下標決定的,連結串列中的順序是由各物件中的指標所決定的 (2)連結串列結點結構 node *prev; node *next; int key; (3)連結串列

演算法導論 18 B

一、定義 1、B樹 B樹是為磁碟或其它直接存取輔助儲存裝置而設計的一種平衡查詢樹,主要特點是降低磁碟I/O操作次數。 B樹以自然的方式推廣二叉查詢樹。 B樹的分支因子由磁碟特性所決定。  2、B數的資料結構 int n:當前儲存在結點x中的關鍵字數 key[N]:n個關鍵,

(資料結構)

二叉樹 資料結構大致分為兩種型別:基於陣列的實現和基於連結串列的實現。 兩種結構的特點: 基於陣列的實現:通過下標或秩,在常數時間內找到目標物件。插入和刪除,需要耗費線性時間。 基於連結串列的實現:藉助引用或位置物件,在常數時間內插入或刪除元素。但需要線性時間,對整個結構進行遍歷查詢

演算法導論15習題答案

15.2-2 Q:請給出一個遞迴演算法MATRIX-CHAIN-MULTIPLY(A,s,i,j),使之在給出矩陣序列<A1,A2,...,An>,和由MATRIX-CHAIN-ORDER計算出的表s, 以及下標i和j後,能得出一個最有的矩陣鏈乘法。(初始呼叫為MATRIX-CHAIN-MULT

演算法導論 20 斐波那契堆

一、綜述1.斐波那契堆斐波那契堆是可合併堆在不涉及刪除的操作(除去EXTRACT和DELETE)中,操作僅需O(1)的平攤執行時間當EXTRACT和DELETE的運算元目較小時斐波那契堆能得到較好的執行效率。斐波那契堆不能有效地支援SEARCH操作用於解決諸如最小生成樹和尋找