二叉搜尋樹

2021-07-09 15:28:40 字數 2396 閱讀 3657

一、定義

二叉搜尋樹,binary search tree,是具有這樣一種性質的二叉樹:對於樹中的每個結點x,它的左子樹中所有項的值小於x中的項,它的右子樹中所有項的值大於x中的項。

此性質意味著只要中序遍歷一下便可得到乙個有序的序列。

定義二叉搜尋樹的資料結構:

typedef struct treenode *bintree;

struct treenode

};

二、操作

bst上的操作主要有:

1. 查詢(search)

遞迴版本(尾遞迴)

bintree search(bintree t, int key)

return t;

}

2. 查詢最大最小值

查詢最大值(遞迴)

bintree findmax(bintree t)

查詢最小值(迭代)

bintree findmin(bintree t)

3. 插入

遞迴

bintree insert(bintree t, int key)

else if(key < t->key)

t->left = insert(t->left, key);

else if(key > t->key)

t->right = insert(t->right, key);

return t;

}

迭代

bintree insert(bintree t, int key)

if(!parent) //空樹

t = new treenode(key);

else if(key < parent->key)

parent->left = new treenode(key);

else

parent->right = new treenode(key);

return t;

}

4. 刪除

刪除某個結點之前是先查詢,找到的待刪除結點t有三種可能情況:

1. 只具有左子樹,只需 t = t->left;

2. 只具有右子樹,只需 t = t->right;

3. 具有左右子樹,這種情況更為複雜,在t的右子樹中找最小key的結點或者在t的左子樹中找最大key的結點,以此值替換t的key,然後刪除右子樹中的最小值或者左子樹中的最大值,這又是乙個遞迴的情況。

bintree delete(bintree t, int key)

else

}return t;

}

5. 前驅和後繼

算導上也給出了關於bst中結點前驅和後繼的描述,假設所有的關鍵字互不相同:

後繼:乙個結點的後繼是大於其key的最小關鍵字的結點;

前驅:乙個結點的前驅是小於其key的最大關鍵字的結點。

給定乙個結點x,如何查詢其後繼呢?分兩種情況:

1. 如果該結點的右子樹非空,那麼x的後繼恰是x右子樹中的最左節點;

2. 如果該結點的右子樹為空且其後繼存在,只要簡單地從x開始沿樹而上直到找到這樣乙個結點,這個結點是其父節點的左孩子。

(需要在treenode中增加乙個parent指標,指示其父節點,同時insert函式也需要稍作修改)

bintree successor(bintree t, int key)

return y;

}

求前驅是求後繼的對稱過程:

bintree precursor(bintree t, int key)

return y;

}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...