排序二叉樹 刪除節點

2021-10-07 10:53:38 字數 3240 閱讀 8644

前面( ),我們已經了解了什麼是排序二叉樹以及排序二叉樹的遍歷和新增元素,現在我們一起來看一下,排序二叉樹是如何刪除元素的。

步驟

先找到要刪除的節點 targetnode

找到要刪除節點的父節點 parent

一、刪除葉子節點

1.確定 targetnoe 是 parent 的左子節點還是右子節點

2.根據前面的情況來對應刪除

parent.left=null.

parent.right=null

二、刪除只有一顆子樹的節點

1.確定 targetnode 的子節點是右子節點還是左子節點

2.確定 targetnode 是 parent 的左子節點還是右子節點

3.對應刪除

三、刪除有兩顆子樹的節點

1.從 targetnode 的右子樹找到最小的節點

2.用乙個臨時變數,將最小節點的值儲存 temp

3.刪除最小節點

4.targetnode.value=temp

**
package xmht.datastructuresandalgorithms.datastructure.binarysorttree;

/** * @author shengjk1

* @date 2020/6/15

*/public

class

binarysorttree

; binarysorttree1 binarysorttree =

newbinarysorttree1()

;for

(int i : arr)

system.out.

println

("中序遍歷二叉樹");

binarysorttree.

infixorder()

; binarysorttree.

delnode(3

);system.out.

println

("刪除之後====中序遍歷二叉樹");

binarysorttree.

infixorder()

;}}class

binarysorttree1

else

}//查詢節點

public node search

(int value)

else

}//查詢父節點

public node searchparent

(int value)

else

}/**

* 返回以 node 為根節點的二叉排序樹的最小節點的值

* 並刪除以 node 為根節點的二叉排序樹的最小節點

* * @param node 傳入節點

* @return 以 node 為根節點的二叉排序樹的最小節點的值

*/public

intdelrighttreemin

(node node)

delnode

(target.value)

;return target.value;

}//刪除節點

public

void

delnode

(int value)

else

//如果發現當前的二叉樹只有乙個節點

if(root.left == null && root.right == null)

//找到 targetnode 的 parentnode

node parentnode =

searchparent

(value)

;//1.如果刪除的節點是葉子節點

if(targetnode.right == null && targetnode.left == null)

else

//刪除有兩顆子樹的節點

}else

if(targetnode.left != null && targetnode.right != null)

else

else

}else

}else

else

}else}}

}}public

void

infixorder()

}@override

public string tostring()

';}}

class

node

/** * @param value 希望刪除節點的值

* @return 有則返回否則返回null

*/public node search

(int value)

else

if(value <

this

.value)

return

this

.left.

search

(value)

;//向右子樹查詢

}else

return

this

.right.

search

(value);}

}//查詢要刪除節點的父節點

/** * @param value

* @return

*/public node searchparent

(int value)

else

else

if(value >=

this

.value &&

this

.right != null)

else}}

//新增節點

//遞迴的形式新增,需要滿足二叉排序樹的要求

public

void

add(node node)

//判斷傳入節點的值,和當前子樹的根節點的值的關係

if(node.value <

this

.value)

else

}else

else}}

//中序遍歷

public

void

infixorder()

system.out.

println

(this);

if(this

.right != null)

}@override

public string tostring()

';}}

二叉樹的節點刪除

刪除 int treedeletedata pnode proot,int data pnode pfind proot pnode pfather null pnode pdelete null 01找到資料為data的節點的位址以及父節點的位址 while pfind null else if ...

刪除二叉樹的節點

總體思想 分多種情況討論 1.被刪除節點沒有子樹的情況,直接刪除,並修改對應父節點的指標為空。2.對於只有乙個子樹的情況,考慮將其子樹作為其父節點的子樹,關於是左還是右,根據被刪除的節點確定。3.最複雜的是有兩個子數的情況,可以考慮兩種方法,都是同樣的思想 用被刪除節點a的左子樹的最右節點或者a的右...

二叉樹的刪除節點

package com.ran public class hello 定義二叉樹 class erchashu 前序遍歷 public void qianxu else public void shanchu int no else else public void zhongxu else pub...