在一顆二叉排序樹上刪除節點

2021-07-22 08:56:02 字數 2344 閱讀 1887

二叉排序樹上,刪除二叉樹節點,有三種情況需要考慮

1、如果刪除的是葉子節點(需要考慮兩種情況,左節點和右節點)如果是左節點,則把父節點的左節點設為null,同理是父節點右節點設為null

2、如果刪除的節點只有乙個子節點,那麼需要考慮子節點是在左邊還是右邊

如果子節點是在左邊,還要考慮被刪除的節點是在左邊還是右邊,如果是左邊,則父節點左孩子節點直接指向子節點,否則是父節點右孩子節點指向子節點

3、如果刪除的節點有兩個子節點,需要找到該節點的中序遍歷的後繼節點,也就是查詢後繼的最左邊節點,找到後讓父節點指向中序後繼節點,

中序後繼的父節點指向中序後繼的右子節點,中序後繼節點的左孩子指向被刪除節點父節點的左孩子節點,中序後繼節點的右孩子節點指向被刪除節點的父節點的右孩子節點

實現過程如下所示:

package cn.edu.nwu.structs.tree;

/** * @author jcm

* 二叉排序樹上,刪除二叉樹節點,有三種情況需要考慮

* 1、如果刪除的是葉子節點(需要考慮兩種情況,左節點和右節點)如果是左節點,則把父節點的左節點設為null,同理是父節點右節點設為null

* 2、如果刪除的節點只有乙個子節點,那麼需要考慮子節點是在左邊還是右邊

* 如果子節點是在左邊,還要考慮被刪除的節點是在左邊還是右邊,如果是左邊,則父節點左孩子節點直接指向子節點,否則是父節點右孩子節點指向子節點

* 3、如果刪除的節點有兩個子節點,需要找到該節點的中序遍歷的後繼節點,也就是查詢後繼的最左邊節點,找到後讓父節點指向中序後繼節點,

* 中序後繼的父節點指向中序後繼的右子節點,中序後繼節點的左孩子指向被刪除節點父節點的左孩子節點,中序後繼節點的右孩子節點指向被刪除節點的父節點的右孩子節點。

* 時間 2023年9月2日

*/public class deletebinarytreenode

/*** @author jcm

* 刪除乙個節點,需要考慮被刪除的節點是葉子節點還是存在乙個子節點還是兩個子節點

* @param root 樹根

* @param data 被刪除的節點的資料項

* @return 返回樹根的引用

*/public static binarytreenode deletebinarytreenode(binarytreenode root,int data)

binarytreenode currenttnode = root;

binarytreenode parenttnode = root;

//定義要刪除的節點是否在左邊

boolean islefttnode = true;

while(currenttnode.data != data)else

if(currenttnode == null)

} //被刪除的節點是葉子節點,沒有子節點

if(currenttnode.lefttreenode == null && currenttnode.righttreenode == null)else if(islefttnode)else

} //如果被刪除的節點有乙個子節點,且只有乙個左孩子節點

if(currenttnode.righttreenode == null)else if(islefttnode)else

} //如果被刪除的節點有乙個子節點,且只有乙個右孩子節點

if(currenttnode.lefttreenode == null)else if(islefttnode)else

}elseelse if(islefttnode)else

//一定別忘了中序後繼的左孩子節點引用指向當前節點的左節點引用

//為什麼中序後繼的右孩子節點引用指向當前節點的右孩子節點引用,因為找中序後續節點已經做了這方面的工作

houjitnode.lefttreenode = currenttnode.lefttreenode;

} return root;

} /**

* 找中序後續節點

* @param deletetnode

* @return

*/public static binarytreenode findhoujitnode(binarytreenode deletetnode)

if(houjitnode != deletetnode.righttreenode)

return houjitnode;

} //中序遍歷,通過n控制層數

public static void show(binarytreenode root,int n)else{

show(root.lefttreenode,n+1);

for (int i=0;i

二叉排序樹刪除節點

description 二叉排序樹的節點 auther eleven create 2020 04 09 20 43 public class node 新增方法 public void add node node if this value node.value else else else 中序...

二叉排序樹新增刪除節點

二叉排序樹 可以很快的檢索到具體的資料。什麼是二叉排序樹 讓左子節點的值小於父節點,右子節點的值大於父節點,這樣的二叉樹稱為二叉排序樹。往二叉排序樹中新增節點 首先要看新增節點的父節點是否為空,在判斷新增節點的值和父節點的值的大小關係,如果小,就放在左節點,如果大就放在右節點 新增節點 public...

二叉排序樹上的查詢

include include define null 0 define n 100 typedef int keytype typedef struct nodebstnode 二叉排序樹結點結構 typedef bstnode bstree 二叉排序樹型別定義 bstnode searching...