每個節點最多兩個子節點,其中左邊節點的值小於該節點的值,右邊節點的值大於該節點的值。為了簡便起見,該二叉樹裝入的資料為整數,且不允許有重複的關鍵字值。
程式設計中為了簡便,採用了遞迴演算法,運算時會帶來額外的開銷,如果能將相應的演算法替換為迭代,則更為有效。刪除的演算法相應複雜一些,但也可以承受。
apiadd:將數加入樹
remove:從樹中刪除指定的節點
contains:樹中是否包含指定的數
ordinal:從小到大遍歷列印數(測試只用)
max:查詢最大值
min:查詢最小值
其中node類是輔助類,為了簡單沒有寫標準的 get,set方法。
因為該樹沒有自我保持平衡的能力,因此對於隨機插入的資料,效果較好,對於有區域性生降序特徵的插入序列,則會失去平衡,極端狀況下,樹退化成煉表。關於平衡樹請參見(tree2-3-4 ,紅黑樹 ,tree-2-3 )
tree的main函式僅為測試之用。
class node
int value()
void left(node left)
void right(node right)
node left()
node right()
}class tree
private void add(node current, node node) else if(node.value() > current.value())
}boolean contains(int value)
private boolean contains(node current, int value)
void remove(int value)
private void remove(node parent, node current, int value)
if(parent == null) root = node;
else if(parent.left() == current) parent.left(node);
else parent.right(node);
} else if(value < current.value()) remove(current,current.left(),value);
else remove(current,current.right(),value);
}private node removemin(node parent, node current)
}int max()
private int max(node current)
int min()
private int min(node current)
void ordinal()
void ordinal(node current)
public static void main(string args)
}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...