一、定義
二叉搜尋樹,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 解釋 輸入為 ...