當一棵二叉樹滿足下面條件的時候就成了二叉查詢樹:對於樹的任意乙個節點,左兒子的值比右兒子小(或者反過來也行)。
二叉查詢樹本質還是二叉樹,因此也具有二叉樹的性質。
這個操作比較簡單,遞迴查詢樹根.
//公有函式contains通過呼叫私有函式contains遞迴查詢。
bool contains(const object &e) const
bool contains(const object &e, node *t)
往乙個二叉查詢樹中插入元素不會改變原樹的結構,只需要找到乙個合適的位置滿足二叉查詢樹的性質就可以了。
void insert(const object &e)
//私有函式操作子樹,二叉查詢樹的插入操作不會改變原樹的結構
void insert(const object &e, node *&t)
else
}
刪除乙個元素必須分情況來討論。
要刪除的節點是葉子。
如果要刪除的節點是乙個葉子,那麼只需要簡單地刪除這個節點,並將其父節點的相關指標置為null就可以了,具體的做法是直接將這個節點的指標變為null,然後釋放其儲存。
要刪除的節點只有乙個子樹。
如果要刪除的節點只有乙個子樹,那麼只需要讓該節點的父節點指向節點的子樹,然後釋放掉該節點的儲存。
要刪除的節點有兩個子樹。
如果要刪除的節點有兩個子樹,那麼需要找出該節點右子樹中的最小元素,並將這個最小元素賦給本節點,再將右子樹中的該元素刪除,此時的刪除操作就轉化成了1中情況(最小元素必為葉子)。
其中,上述1和2可以合併實現。
void remove(const object &e)
void remove(const object &e, node *&t)
else
}
template class binarysearchtree
binarysearchtree(binarysearchtree &t)
~binarysearchtree()
//深拷貝
binarysearchtree & operator =(binarysearchtree &t)
void insert(const object &e)
void remove(const object &e)
bool contains(const object &e) const
bool isempty() const
const object & findmin() const
const object & findmax() const
void makeempty()
void printtree()
}void remove(const object &e, node *&t)
else
} bool contains(const object &e, node *t)
const object & findmin(node *t) const
return t->element;
} const object & findmax(node *t) const
return t->element;
} void makeempty(node * &t)
t = null;
} node * clone(node *t)
void printtree(const node *t)
};
(資料結構)二叉查詢樹
樹,是一種資料結構。它是由n個有限節點組成乙個具有層次關係的集合。特點 樹的基本術語 節點的度 節點擁有的子樹的數目。葉子 度為零的節點。分支節點 度不為零的節點。樹的度 樹中節點的最大的度。層次 根節點的層次為1,其餘節點的層次等於該節點的雙親的層次加1。樹的高度 樹中節點的最大層次。無序樹 如果...
資料結構 二叉查詢樹
使二叉樹成為二叉查詢樹的性質是,對於樹中的每個節點x,它的左子樹中所有關鍵字值小於x的關鍵字值,而它的右子樹中所有關鍵字值大於x的關鍵字值。這意味著,該樹所有的元素以某種統一的方式排序。二叉查詢樹是一棵特殊的二叉樹,二叉查詢樹中節點的結構與二叉樹種節點的結構相同,關鍵在於可以在二叉查詢樹上可以執行的...
資料結構 樹 二叉查詢樹
wiki 首先是名稱 二叉查詢樹英文叫binary search tree,這個在很多演算法題目中很常見所以要記住,特別是英文題目中。也叫做二叉排序樹,二叉搜尋樹等等。具體的定義比較官方,用自己的話說,首先它肯定是二叉樹,其次,當前節點的左子葉元素值比當前節點小,右子葉元素值比當前節點大,所以節點均...