二叉搜尋樹及簡單電話本

2021-09-28 13:24:58 字數 2978 閱讀 8978

二叉搜尋樹又稱二叉排序樹(純 key 模型,且 key值不能重複,二叉搜尋樹的中序遍歷是有序的),它或者是一棵空樹**,或者是具有以下性質的二叉樹:

若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值

若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值

它的左右子樹也分別為二叉搜尋樹

1.查詢:在搜尋樹中查詢 key 值,若找到返回該節點,未找到返回空節點。時間複雜度 o(log(n)) - o(n)  

思路:

public node search(int key)else if(key > cur.key)else

}return null;

}

2.插入:如果樹為空,直接插入,否則按照查詢邏輯確定插入位置進行插入

思路:

public boolean insert(int key)

// 尋找 key 值的合理位置,若該值已有則插入失敗

node cur = root;

node parent = null;

while(cur != null)else if(key < cur.key)else

}// 插入

node node = new node(key);

if(key > parent.key)else

return true;

}

3.刪除設待刪除結點為 cur, 待刪除結點的雙親結點為 parent

1. cur.left == null

cur 是 root,則 root = cur.right

cur 不是 root,cur 是 parent.left,則 parent.left = cur.right

cur 不是 root,cur 是 parent.right,則 parent.right = cur.right

2. cur.right == null

cur 是 root,則 root = cur.left

cur 不是 root,cur 是 parent.left,則 parent.left = cur.left

cur 不是 root,cur 是 parent.right,則 parent.right = cur.left

3. cur.left != null && cur.right != null

需要使用替換法進行刪除,即在它的右子樹中尋找關鍵碼最小的(或者在左子樹尋找關鍵碼最大的),用它的值填補到被刪除節點中,再來處理該結點的刪除問題

// 判斷 goat 是 goatparent 的左孩子還是右孩子

if(goat == goatparent.left)else}}

完整測試**

基本操作:查詢,插入,更新。與搜尋樹思路相同,只是多考慮乙個 value。(key 允許重複,value 不允許重複)

public class contact 

}private node root = null;

// 查詢,沒有找到返回 null,否則返回這個人的**

public string search(string name)else if(name.compareto(cur.name) > 0)else

}return null;

}// 插入,若不存在則插入,若存在則插入失敗

public boolean insert(string name, string phone)else if(name.compareto(cur.name) > 0)else

}node node = new node(name,phone);

if(parent.name.compareto(name) > 0)else

return true;

}// 更新**本,若存在該使用者更新他的**,不存在返回 false

public boolean update1(string name,string phone)else if(name.compareto(cur.name) > 0)else

}return false;

}// 更新**本,若存在該使用者更新他的舊**,否則返回 null

public string update2(string name,string phone)else if(name.compareto(cur.name) > 0)else

}return null;}}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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...

二叉搜尋樹簡單介紹

2.最大關鍵字元素和最小關鍵字元素 2.插入和刪除 2.刪除 1.概述 一棵二叉搜尋樹是以一棵二叉樹組織的,其中每個結點就是乙個物件,每個節點包含屬性left right p,它們分別指向結點的左孩子,右孩子和雙親,如果某個結點的孩子的屬性值不在,則為nil。對任何結點x,x左子樹中的關鍵字最大不超...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...