二叉搜尋樹

2022-08-28 08:03:11 字數 2292 閱讀 2276

定義:二叉搜尋樹是二叉樹的一種,是應用非常廣泛的一種二叉樹,英文簡稱為 bst

性質:

int size() // 元素的數量

boolean isempty() //是否為空

void clear() //清空所有元素

void add(e element) //新增元素

void remove(e element) //刪除元素

boolean contains(e element)//是否包含某元素

新增節點
步驟:

找到父節點parent

建立新節點

parent.left = node || parent.right = node

如果是相同值,覆蓋舊的值

實現**:

//新增節點

public void add(e element)

//新增非第乙個節點

//找到父節點

nodeparent = root;

nodenode = root;

int cmp = 0;

while(node != null) else if (cmp < 0) else

}//新增到父節點的哪個位置

nodenewnode = new node(element, parent);

if(cmp > 0) else

size++;

}

元素之間的比較設計

允許外界傳入乙個comparator自定義比較方案

如果沒有傳入comparator,強制認為元素已經實現了compareable介面

**:

//comparator欄位

private comparatorcomparator;

//二叉搜尋樹的構造器

public binarysearchtree()

public binarysearchtree(comparatorcomparator)

/** * 節點值比較方法

* 返回值等於0,e1 == e2;

* 返回值大於0,e1大於e2;

* 返回值小於0,e1小於e2.

*/private int compare(e e1, e e2)

return ((comparable)e1).compareto(e2);

}

根據元素內容獲取節點
//獲取元素對應的節點

private nodenode(e element) else

}return null;

}

刪除節點

情況有四種:

remove節點是葉子節點

直接刪除

若 node = node.parent.left;

則 node.parent.left = null;

若 node = node.parent.right;

則 node.parent.right = null;

若 node.parent = null;

則 node.parent.left = null;

remove節點是度為1的節點

用子節點替代原節點的位置

設child是node.left或者child是node.right

用child替代node的位置

remove節點是度為2的節點

用前驅或者後繼節點的值覆蓋原節點的值

然後刪除相應的前驅或者後繼節點

注意:如果乙個節點的度為2,那它的前驅、後繼節點的度只可能是1 || 0

remove節點是根節點

//移除節點

public void remove(e element)

private void remove(nodenode)

//刪除度為1或者為0的節點

nodereplacement = node.left != null ? node.left : node.right;

if (replacement != null) else if (node == node.parent.right) else

} else if (node.parent == null) else else

}}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...