二叉搜尋樹又稱二叉排序樹
若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值
若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值
它的左右子樹也分別為二叉搜尋樹
**特點:**二叉搜尋樹的中序遍歷是有序的
思路:
**實現:
//查詢
public
boolean
search
(integer key)
else
if(result >0)
else
}return
false
;}
思路:插入時,插入位置在原樹內一定為null,如果樹內有重複值,拋出自定義異常
**實現:
//插入
public
void
insert
(integer key)
node current = root;
//定義乙個parent結點,parent結點始終為current的父節點
node parent = null;
while
(current != null)
else
if(result <0)
else
}//此時current結點為空,parent結點代表要插入結點的父節點,此時判斷插入結點在左還是右
int temp = key.
compareto
(parent.key);if
(temp <0)
else
}
思路:
**實現:
//刪除
public
boolean
remove
(integer key)
else
if(cmp<0)
else
}//沒找到
return
false;}
//node為找到的結點,parent為node的父節點
private
void
removeinternal
(node node, node parent)
else
if(node==parent.left)
else
}else
if(node.left!=null&&node.right==null)
else
if(node==parent.left)
else
}else
if(node.left==null&&node.right!=null)
else
if(node==parent.left)
else
}else
//1.替換node的key為ghost的key
node.key=ghost.key;
//2.刪除ghost結點(ghost的右孩子一定為空)
//<1>當node==ghostparent時,ghost是ghostparent的左孩子
if(node==ghostparent)
else
}}
插入和刪除操作都必須先查詢,查詢效率代表了二叉搜尋樹中各個操作的效能。
對有n個結點的二叉搜尋樹,若每個元素查詢的概率相等,則二叉搜尋樹平均查詢長度是結點在二叉搜尋樹的深度的函式,即結點越深,則比較次數越多。時間複雜度越大
最好:完全二叉樹o( log(n))
最壞:單支o(n*2)
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...