二叉樹的乙個重要的應用是他們在查詢中的應用假設樹中的每乙個結點儲存一項資料。使二叉樹成為二叉查詢樹的性質是,對於樹中的每個結點x,它的左子樹中所有項的值小於x中的項,而它的右子樹中所有項的值大於x中的項。注意,這意味著,該樹所有死亡元素都可以用某一種一致的方式排序。
template
comparable>
class
binarysearchtree
};binarynode *root;
void insert(const
comparable &x, binarynode * &t )const;
void remove( const
comparable & x,binarynode * & t) const;
binarynode * findsmin( binarynode* t) const;
binarynode * findmax( binarynoode* t) const;
bool contains (const
comparable & x, binarynode *t) const;
void makeempty(binarynode *t);
void printtree(binarynode *t ) constl
binarynode * clone( binarynode *t) conbst;
};
二叉查詢樹類的框架
contains方法
如果在樹t中有項為x的結點,那麼contain操作就返回true,否則,若沒有這樣的結點就返回false。樹結構使得該操作很簡單。如果t為空,那麼就可以返回false:否則,如果存在存在x就返回true。若以上兩種情況都不成立,就對t的乙個子樹進行遞迴呼叫。至於是左子樹還是右子樹取決於x與儲存在t中的項的關係。
/**
*return true
if x is found in the tree.
*/bool contains( const comparable & x ) const
/***insert x into the tree; duplicates are ignored.
*/void insert( const comparable & x)
/*** remove x from the tree. nothing is done if x is
not found.
* /void remove( const comparable & x)
/***internal method to test if an item is
in a subtree.
* x is item to search for.
* * t is the node that roots the subtree.
* /bool contains(const comparable * x, binarynode *t ) const
注意測試的順序。關鍵的問題是首先要對是否為空樹進行測試,因為如果不這麼做就會產生乙個企圖通過null指標訪問資料成員的執行錯誤。其餘的測試應該使得最不可能的情況安排在最後進行。還要注意,這裡的兩個遞迴呼叫事實上都尾遞迴並且可以通過乙個while迴圈很容易代替。尾遞迴的使用在這裡是合理的,因為演算法表示式的簡明性是以速度的降低為代價的,而這裡所使用的棧空間的量也只不過是o(logn)而已。
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...
二叉樹 二叉查詢樹
二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...
樹(樹,二叉樹,二叉查詢樹)
1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...