二叉搜尋樹又稱二叉排序樹(純 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 ...