樹家族是為了實現方便快捷的查找而存在的。樹的高度是命中查找的一個不可抗拒的時間下限。在一定的數據條件下,樹的高度和寬度是互相制約的。(就像一定面積下,矩形的長和寬是互相制約的)而樹家族中最簡單的二叉樹,儘管易於實現,卻不能有實際的價值。其最最令人髮指的是二叉樹的高度太高。n叉樹的提出和實現解決了二叉樹的不足,典型的n叉樹有:2-3-4樹/紅黑樹和B樹。
基本介紹
- 中文名:n叉樹
- 外文名:n-ary tree
- 別稱:多叉樹
- 類型:數據結構
- 學科:計算機科學
- 典型結構:B樹,2-3-4樹
定義
性質
- 每個節點有m個子節點和m-1個鍵值。
- 每個節點中的鍵值按升序排列。
- 前i個子節點中的鍵值都小於第i個鍵值。
- 後m-1個子節點中的鍵值都大於第i個鍵值。
分類
B樹
- 每個點最多有n個孩子
- 每個非葉子節點(根節點除外)最多有n/2(向上取整)到n個孩子
- root至少有2個子樹,除非root的孩子是葉子節點
- k個孩子的非葉子節點含有k-1個鍵值
- 所有的葉子節點都在同一層,並且內部節點不攜帶任何信息。(B樹的階指最大子節點數。優勢,n階的B樹節點定義為有k個鍵值和k+1個指針,其中n<=k<=2n,用於指定最少的子節點數)
2-3-4樹
- 2-節點,就是說,它包含1個元素和2個子節點
- 3-節點,就是說,它包含2個元素和3個子節點
- 4-節點,就是說,它包含3個元素和4個子節點
實現
B樹
template<class t,="" int="" m=""> class BTreeNode{ public: BTreeNode(); BTreeNode(const T&); private: bool leaf; int keyTally; T keys[M-1]; BTreeNode *pointers[M]; friend BTree<t,m>; } </t,m></class>
B樹的查找
BTreeNode *BTreeSearch(keyType K,BTreeNode *node){ if(node != 0){ for(i=1;i<node->keyTally && node->keys[i-1]<k;i++); if(i="">node->node->keyTally||node->keys[i-1]>K) return BTreeSearch(K,node->pointers[i-1]); else return node; } else return 0; } </k;i++);></node->
B樹的插入
BTreeInsert(K) 找到一個葉節點node來插入k while(true) 在數組keys中為k找到一個合適的位置; if node 不滿 插入K並遞增keyTally; return; else 將node分解為node1(=node)與node2(新節點); 在node1和node2之間平均分配鍵值和指針,並正確地初始化他們的keyTally; k=中間鍵值 if node 是根節點 穿件一個心的根節點,作為node1和node2的父節點 將K及指針node1和node2的指針妨礙根節點中,並將根節點的keyTally設為1; return; else node = 其父節點。//處理父節點