查詢插入
刪除二叉搜尋樹 (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 解釋 輸入為 ...