二叉搜尋樹

2021-09-23 15:27:30 字數 2370 閱讀 9612

查詢插入

刪除二叉搜尋樹 (binary search tree, bst) 又稱二叉排序樹或二叉查詢樹。

二叉搜尋樹的左子樹均小於根節點,右子樹均大於根節點。

// 節點定義

struct bstnode

先序遍歷:訪問根節點;遍歷左子樹;遍歷右子樹。

中序遍歷:遍歷左子樹;訪問根節點;遍歷右子樹。(由於二叉搜尋樹具有左子樹《根節點《右子樹的性質,中序遍歷二叉搜尋樹的結果是所有節點的公升序序列。)

後序遍歷:遍歷左子樹;遍歷右子樹;訪問根節點。

遍歷的時間複雜度:o(n)。(因為每個節點都要被訪問一次。)

// 遞迴實現

void preorderrecursively(bstnode* pnode)

}// 迭代實現????

void preorderiteratively(bstnode* pnode)

從根節點開始查詢給定的key,若key《根節點,則繼續查詢左子樹;若key>根節點,則繼續查詢右子樹。

查詢的時間複雜度:o(h)。(h為二叉搜尋樹的高度。)

可以發現當二叉搜尋樹近似平衡的時候,查詢的時間複雜度為o(logn);當二叉搜尋樹完全不平衡的時候,查詢的時間複雜度為o(n)。

查詢最小值,為二叉搜尋樹的最左端的節點;查詢最大值,為二叉搜尋樹最右端的節點。

// 遞迴實現

bstnode* searchrecursively(bstnode* pnode, int key)

if (key < pnode->key)

else

}// 迭代實現

bstnode* searchiteratively(bstnode* pnode, int key)

else

} return pnode;

}

二叉樹的最左節點。

bstnode* searchminimum(bstnode* x)

return x;

}

二叉樹的最右節點。

bstnode* searchmaximum(bstnode* x)

return x;

}

給定一棵二叉搜尋樹的結點,查詢二叉樹中序遍歷的後繼(即排序序列中該結點的後乙個元素)。由於二叉搜尋樹的性質,我們可以通過沒有任何關鍵字的比較來確定後繼。

bstnode* searchsuccessor(bstnode* x)

return y;

查詢前驅與查詢後繼的情況是對稱的。

bstnode* searchpredecessor(bstnode* x)

return y;

}

插入過程首先從根開始遍歷,在遍歷過程中我們要記錄雙親,然後通過關鍵字的比較,決定向左向右移動,直到找到乙個null,就是要插入的位置。

注意:插入結點後,新結點總是作為乙個新的葉子結點而存在。

插入的時間複雜度:o(logn)

void insert(bstnode *& t, int key)

pnode->parent = y;

if (y == null)

t = pnode; // 插入的結點為根節點

else if (key < y->key)

y->lchild = pnode;

else

y->rchild = pnode;

}

需要保證刪除後不改變二叉搜素樹的性質。

刪除的時間複雜度為:o(h)。h為二叉搜素樹的高度。

// 用一棵以v為根的子樹替換一棵以u為根的子樹,u的父節點變為v的父節點,u的父節點的孩子結點變為v

void transplant(bstnode* &t, bsnode* u, bstnode* v)

// 將結點z從以t為根節點的二叉搜尋樹中刪除

bstnode* delete(bstnode* &t, bstnode* z)

transplant(t, z, y);

y->lchild = z->lchild;

y->lchild->parent = y;

} return z;

}

參考資料:

[1] [深入學習理解二叉搜尋樹(附詳細講解與例項分析)] (

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...