二叉搜尋樹

2021-10-01 11:47:07 字數 2508 閱讀 3916

一、定義

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