一、定義
二叉搜尋樹:二叉搜尋樹(binary search tree),它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。
二、具體操作
1、查詢。
2、插入。
3、刪除。具體分析如下圖所示
4.一般不建議修改。因為對於二叉搜尋樹來說,修改操作不能針對key修改,最多修改value。如果實在要修改key,可以先刪key,再插入乙個新的key
三、特性
1.二叉搜尋樹的中序遍歷是乙個有序序列
2.最優情況下平均比較次數:log2n,最差情況下平均比較次數:n/2
3.**實現的圈複雜度非常高
四、**實現
public class binarysearchtree
@override
public string tostring() }
//建立乙個根節點,初始情況為空樹,根節點指向null
private node root = null;
//查詢
public node search(int key) else if (key < cur.key) else
} //沒找到
return null; }
//插入
//1.先找到合適位置
//2.把新節點放入該位置
//插入失敗約定方式:
//(1)如果當前key已存在,則插入失敗(treeset)
//(2)如果當前key存在,直接修改value(treemap)
public boolean insert(int key,int value)
//2.非空樹,先找合適的位置,查詢過程中隨時記錄當前節點的父節點
node cur = root;
//parent一直指向cur的父節點
node parent = null;
while(cur != null) else if (key < cur.key) else
} //迴圈結束,cur一定是null,新節點應當插入到parent下方
//迴圈操作的關鍵就在於:找到parent是誰
node newnode = new node(key, value);
if(key < parent.key) else
return true; }
//刪除
public boolean remove(int key) else if (key < cur.key) else
} //未找到對應節點
return false;
} //輔助刪除函式
private void removenode(node parent,node cur) else if (cur==parent.left) else
}else if (cur.right == null) else if (cur==parent.left) else
}else
//迴圈結束,scapegoat就是替罪羊結點
把替罪羊的key、value賦給待刪除節點
cur.key = scapegoat.key;
cur.value = scapegoat.value;
刪除替罪羊結點,它一定沒有左子樹
// 還需根據替罪羊是父節點左還是右,進一步判斷如何刪除
if(scapegoat == goatparentnode.left) else
} }public static void main(string args) ;
for (int x : arr)
tree.remove(5);
preorder(tree.root);
system.out.println();
inorder(tree.root);
system.out.println();
system.out.println(tree.search(9)); }
public static void preorder(node root)
system.out.print(root.key+" ");
preorder(root.left);
preorder(root.right); }
public static void inorder(node root)
inorder(root.left);
system.out.print(root.key+" ");
inorder(root.right);
}}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...