二叉搜尋樹

2022-08-14 19:30:16 字數 3535 閱讀 5965

若二叉排序樹為空,則待插入結點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.刪除的節點同時存在左子樹和右子樹:將刪除節點的左子樹的最右節點或右子樹的最左節點替換刪除節點,同時刪除替換節點,再將刪除節點指向子樹節點。

class

node

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)

}

public

class 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 解釋 輸入為 ...