若二叉排序樹為空,則待插入結點s作為根結點插入到空樹中;
當非空時,將待插結點關鍵字s->key和樹根關鍵字t->key進行比較,若s->key = t->key,則無須插入,
若s->key < t->key,則插入到根的左子樹中,若s->key > t->key,則插入到根的右子樹中。
而子樹中的插入過程和在樹中的插入過程相同,如此進行下去,直到把結點s作為乙個新的樹葉插入到二叉排序樹中,
或者直到發現樹已有相同關鍵字的結點為止。
假定二叉排序樹的根結點指標為 root ,給定的關鍵字值為 k ,則查詢演算法可描述為:
① 置初值: q = root ;
② 如果 k = q -> key ,則查詢成功,演算法結束;
③ 否則,如果 k < q -> key ,而且 q 的左子樹非空,則將 q 的左子樹根送 q ,轉步驟②;否則,查詢失敗,結束演算法;
④ 否則,如果 k > q -> key ,而且 q 的右子樹非空,則將 q 的右子樹根送 q ,轉步驟②;否則,查詢失敗,演算法結束。
刪除節點分為幾種情況:
1.刪除的節點為葉子節點:直接刪除。
2.刪除的節點只存在左子樹或右子樹:刪除節點的父節點直接指向子樹節點。
3.刪除的節點同時存在左子樹和右子樹:將刪除節點的左子樹的最右節點或右子樹的最左節點替換刪除節點,同時刪除替換節點,再將刪除節點指向子樹節點。
classnode
public node(int key, int
value, node leftchild, node rightchild)
public
node()
@override
public
string tostring()
public
intgetkey()
public
void setkey(int
key)
public
intgetvalue()
public
void setvalue(int
value)
public
node getleftchild()
public
void
setleftchild(node leftchild)
public
node getrightchild()
public
void
setrightchild(node rightchild)
}
publicclass binarytree extends
absbinarytree
public
void
setroot(node root)
//二叉排序樹查詢節點
//找到和key相等則返回相應節點,否則返回 null。
@override
public node find(int
key)
else
if (key >currentnode.key)
}return
currentnode;
}@override
public
void insert(int key, int
value)
node currentnode = this
.root;
node parentnode = this.root;//
指向currentnode節點的父節點
boolean isleftchild = true
;
//尋找插入位置
while (currentnode != null
) else
if (key >currentnode.key)
else
}//插入節點
if (parentnode !=currentnode)
else
} else
}@override
public
boolean delete(int
key)
else
}if (currentnode == null) return
false;//
空樹
//要刪除的節點為葉子節點,刪除的第一種情況
if ((currentnode.leftchild == null) && (currentnode.rightchild == null
))
else
if(isleftchild)
else
//要刪除的節點只有左孩子 第二種情況
} else
if ((currentnode.rightchild == null) && (currentnode.leftchild != null
))
else
if(isleftchild)
else
//要刪除的節點只有右孩子 第三種情況
} else
if ((currentnode.leftchild == null) && (currentnode.rightchild != null
))
else
if(isleftchild)
else
} //最後一種情況,待刪除節點既有左子樹又有右子樹
else
return
true
; }
//獲取到待刪除節點的中序直接後繼節點。將該後繼節點從二叉樹中刪除並返回
@override
public
node getdirectpostnode(node delnode)
if (direcrpostnode != delnode.rightchild)
return direcrpostnode;//
返回此直接後繼節點
}// 前序遍歷樹
@override
public
void
preorder(node rootnode)
}// 中序遍歷樹
@override
public
void
inorder(node rootnode)
}// 後序遍歷樹
@override
public
void
postorder(node rootnode)
}/*** // 基於二叉排序樹查詢find查詢節點,然後通過node的setvalue將新值賦值過去。
*/@override
public
boolean update(int key, int
value)
}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...