先給出lintcode的題目:實現trie樹
trie樹的一般性質如下:
1.根節點不包含字元,除根節點外每乙個節點都只包含乙個字元。
2.從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串。
3.每個節點的所有子節點包含的字元都不相同。
那麼既然是樹,既然需要和字串匹配,那麼樹的節點怎麼定義?我們可以這樣分析,插入乙個字串「abcd」時我們乙個乙個插,且a->b->c->d,我們的節點必須要包含a等字元資訊,在查詢時好一一匹配。同時我們要有結束符來表示字串末尾,這是為了abcd和abcde區別開來。
實現**如下,lintcode通過率為70%,不知道**有問題。
/**
* your trie object will be instantiated and called as such:
* trie trie;
* trie.insert("lintcode");
* trie.search("lint"); will return false
* trie.startswith("lint"); will return true
*/ #define max_child 26
class trienode
};class trie
// inserts a word into the trie.
void insert(string word)
else
t=t->child[word[i]-'a'];
i++;
}t->count=1;
}// returns if the word is in the trie.
bool search(string word)
i++;
}if((i==n)&&(t->count==1))return true;
return false;
}// returns if there is any word in the trie
// that starts with the given prefix.
bool startswith(string prefix)
i++;
}return true;
}private:
trienode* root;
};
還有一種節點資料結構的方法,就是結構體換成map和bool isleaf兩個成員變數。思想一樣,也可以這樣來實現。
重點在插入時,順著某一節點不斷插入。上述用trienode*陣列作為當前節點的成員變數,實則指向下乙個節點,因為trienode*存放的是下一節點的值,陣列下標表示邊值。因為字母僅有26,所以陣列大小可以宣告為26.
map的實現機制是一樣的,鍵儲存字元,值表示下一節點的值。
Trie樹的C 實現
先給出lintcode的題目 實現trie樹 trie樹就是字典樹,用在搜尋引擎如搜尋詞條,還比如說之前dns網域名稱解析系統搜尋根據網域名稱搜尋ip。總之,是棵樹,根據字串搜尋某一節點,同時就可獲得節點儲存的資訊了。trie樹的一般性質如下 1.根節點不包含字元,除根節點外每乙個節點都只包含乙個字...
Trie樹(字典樹)的C 實現
trie樹,又稱字典樹 單詞查詢樹 字首樹,是一種雜湊樹的變種,應用於字串的統計與排序,經常被搜尋引擎系統用於文字詞頻統計。優點是查詢快,利用字串的公共字首來節省儲存空間,最大限度的減少無謂的字串比較。對於長度為m的鍵值,最壞情況下只需花費o m 的時間 而bst需要o mlogn 的時間。leet...
Trie樹的實現
一 定義 trie,又稱字典樹,是一種用於快速檢索的二十六叉樹結構。典型的空間換時間 二 結構圖 三 原理 特別地 和二叉查詢樹不同,在trie樹中,每個結點上並非儲存乙個元素。四 性質 0 利用串的公共字首,節約記憶體 1 在trie樹上進行檢索總是始於根結點 2 根節點不包含字元,除根節點外的每...