數據結構之二叉搜索樹

什麼是二叉搜索樹呢?它與別的數據結構相比其優勢又是什麼呢?

一顆二叉搜索樹就是以一顆二叉樹來組織和存儲數據的,如圖所示(圖a是包含6個節點、高度爲2的二叉樹,圖b是包含相同關鍵字、高度爲4的低效二叉樹)。對比博文前面所介紹的鏈表,二叉樹也是可以用結構體來實現,只不過每個節點裏面不僅要保存數據本身的關鍵字(稱之爲key),還要有左節點(左孩子left)、右節點(右孩子right)、父節點(p);根節點的父節點爲NULL。基本概念瞭解後,我們要明確二叉樹要滿足:對每個節點而言,其中保存的關鍵字key不小於其左孩子的key,要不大於其右孩子的key。


接下來我們要明確的是採用該種數據結構的優勢:二叉樹上的基本操作(查找,找到最小值,找到最大值,找到一個節點的前驅或後繼,插入,刪除等)所花費的時間與樹的高度成正比。(證明見算法書第十二章)

那我們只要知道這樣的數據結構什麼時候用好就ok了,下面的代碼也不用自己會編,關鍵是編碼思想的掌握。

然後就是代碼實現一些基本操作(Search、MinNum、MaxNum、Predecessor、Successor、Insert、Delete)

#include<iostream>
struct ListNodeOfBinaryTree
{
	int key;
	ListNodeOfBinaryTree* p;
	ListNodeOfBinaryTree* left;
	ListNodeOfBinaryTree* right;
};
void InorderTreeWalk(ListNodeOfBinaryTree* x) {
	if (x) {
		InorderTreeWalk(x->left);
		std::cout << x->key << "	";
		InorderTreeWalk(x->right);
	}
}//中序遍歷輸出
ListNodeOfBinaryTree* TreeSearch(ListNodeOfBinaryTree* x, int k) {
	/*if (!x||x->key == k) return x;
	if (x->key>k) {
		return TreeSearch(x->right, k);
	}
	else return TreeSearch(x->left, k);遞歸版本*/
	while (x&&x->key != k) {
		if (x->key > k) {
			x = x->left;
		}
		else x = x->right;
	}
	return x;
}//在以x爲根的樹中查找關鍵字爲k的元素位置。
ListNodeOfBinaryTree* MinNum(ListNodeOfBinaryTree* x) {
	while (x->left) {
		x = x->left;
	}
	return x;
}
ListNodeOfBinaryTree* MaxNum(ListNodeOfBinaryTree* x) {
	while (x->right) {
		x = x->right;
	}
	return x;
}


發佈了31 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章