二叉搜尋樹

2022-08-27 03:21:10 字數 3129 閱讀 2973

二叉搜尋樹(bst)有時也被叫做有序二叉樹或者排序二叉樹是一種特別的容器型別:是一種儲存資料到記憶體中的資料結構。二叉樹允許快速查詢,新增和刪除元素,而且不僅可以被用於實現動態資料集,而且在查詢資料表的時候可以允許通過key來查詢乙個元素。

二叉查詢樹會保持節點的key是排好序的,因此做查詢或者其他操作的時候可以使用二分法

時間複雜度o(logn)

如圖:左小中 中小右

binarysearchtreenode:

import binarytreenode from '../binarytreenode';

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();

}}

binarysearchtree:

import binarysearchtreenode from './binarysearchtreenode';

export

default

class

binarysearchtree [nodevaluecomparefunction]

*/constructor(nodevaluecomparefunction)

/*** @param

value

* @return

*/insert(value)

/*** @param

value

* @return

*/contains(value)

/*** @param

value

* @return

*/remove(value)

/*** @return

*/tostring()

}

note:

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 解釋 輸入為 ...