二叉搜尋樹(bst)有時也被叫做有序二叉樹或者排序二叉樹是一種特別的容器型別:是一種儲存資料到記憶體中的資料結構。二叉樹允許快速查詢,新增和刪除元素,而且不僅可以被用於實現動態資料集,而且在查詢資料表的時候可以允許通過key來查詢乙個元素。
二叉查詢樹會保持節點的key是排好序的,因此做查詢或者其他操作的時候可以使用二分法
時間複雜度o(logn)
如圖:左小中 中小右
binarysearchtreenode:
import binarytreenode from '../binarytreenode';binarysearchtree:import comparator from '../../../utils/comparator/comparator';
export
default
class binarysearchtreenode extends
binarytreenode [value] - node value.
* @param
[comparefunction] - comparator function for node values.
*/constructor(value = null, comparefunction =undefined)
/*** @param
value
* @return
*/insert(value)
if (this.nodevaluecomparator.lessthan(value, this
.value))
const newnode = new binarysearchtreenode(value, this
.comparefunction);
this
.setleft(newnode);
return
newnode;
}if (this.nodevaluecomparator.greaterthan(value, this
.value))
const newnode = new binarysearchtreenode(value, this
.comparefunction);
this
.setright(newnode);
return
newnode;
}return
this
; }
/*** @param
value
* @return
*/find(value)
if (this.nodevaluecomparator.lessthan(value, this.value) && this
.left)
if (this.nodevaluecomparator.greaterthan(value, this.value) && this
.right)
return
null
; }
/*** @param
value
* @return
*/contains(value)
/*** @param
value
* @return
*/remove(value)
const = nodetoremove;//
找到要移除結點的父結點
if (!nodetoremove.left && !nodetoremove.right)
else
}else
if (nodetoremove.left &&nodetoremove.right)
else
}else
else
}//clear the parent of removed node.
nodetoremove.parent = null
;
return
true
; }
/*** @return
*/findmin()
return
this
.left.findmin();
}}
import binarysearchtreenode from './binarysearchtreenode';note:export
default
class
binarysearchtree [nodevaluecomparefunction]
*/constructor(nodevaluecomparefunction)
/*** @param
value
* @return
*/insert(value)
/*** @param
value
* @return
*/contains(value)
/*** @param
value
* @return
*/remove(value)
/*** @return
*/tostring()
}
1.binarysearchtreenode中remove的說明:找到要刪除的結點,要刪除結點的父結點,
即:
const = nodetoremove;然後分三種情況考慮
(1)沒有左孩子也沒有右孩子,如果存在父結點則,刪除該節點,否則根結點置空
(2)左(this.left)右孩子(this.right)都有,找到該結點右子樹最小的結點即為min進行判斷
如果min!=this.right,則遞迴的去刪除掉min所在結點,並且把min的值賦給this
!!!如果min=this.right,則this.right.left必為null,,所以把min值給this,同時,this.right=this.right.right.
(3)只有左孩子或者右孩子,如果有父結點,則用該結點的左或右孩子替換掉該結點,否則刪除該結點的左或右結點,並且把該結點的左或右結點的1.值2.左孩子3.右孩子,賦值給該結點。
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...