import java.util.Stack;
/**
* @Author JH
* @CreateDate 18-6-11
* @Description 在二叉查找樹中刪除一個節點
* 1.如果該節點是葉子節點 刪除該節點
* 2.如果該節點有左子樹 將左子樹的根節點代替該節點
* 3.如果該節點只有右子樹 將右子樹根節點代替該節點
* 4.既有左節點又有右節點,用右節點代替該節點 將左節點放在右節點的左子樹的最左邊
*/
class TreeNode{
TreeNode left;
TreeNode right;
int val;
public TreeNode( int val) {
this.left = null;
this.right = null;
this.val = val;
}
}
public class DeleteNodeInBST {
public boolean delete(TreeNode root,int key){
Stack<TreeNode> stack=new Stack<TreeNode>();
TreeNode p=root,q;
while(p!=null){
System.out.println(p.val);
stack.push(p);
if (p.val==key){
//刪除節點的左右子樹都爲空 直接將父節點的該左子樹或者右子樹置空
if (p.left==null&&p.right==null){
System.out.println(" p.left==null&&p.right==null"+p.val);
if(!stack.isEmpty()){
stack.pop();
q=stack.peek();
if (q.left==p){
q.left=null;
return true;
}else{
q.right=null;
return true;
}
}else{
return false;
}
//左子樹爲空 將右子樹直接放到父節點的刪除節點位置上
}else if (p.left==null&&p.right!=null){
System.out.println(" p.left==null&&p.right!=null"+p.val);
if (!stack.isEmpty()){
stack.pop();
q=stack.peek();
if (q.left==p){
q.left=p.right;
}else {
q.right=p.right;
}
}else {
return false;
}
//右子樹爲空 左子樹放到該節點位置上
}else if(p.left!=null&&p.right==null){
System.out.println(" p.left!=null&&p.right==null"+p.val);
if (!stack.isEmpty()){
stack.pop();
q=stack.peek();
if (q.left==p){
q.left=p.left;
}else {
q.right=p.left;
}
return true;
}else {
return false;
}
}else {
//左右子樹都不爲空 將左子樹節點放到右子樹的最左邊
System.out.println(" p.left!=null&&p.right!=null"+p.val);
TreeNode n=p.right;
while (n.left!=null){
n=n.left;
}
if (!stack.isEmpty()){
stack.pop();
q=stack.peek();
if (q.left==p){
q.left=p.right;
n.left=p.left;
}else {
q.right=p.right;
n.left=p.left;
}
return true;
}else {
return false;
}
}
}else {
if (p.val>key){
p=p.left;
}else {
p=p.right;
}
}
}
return false;
}
public static void main(String[] args) {
TreeNode t1=new TreeNode(20);
TreeNode t2=new TreeNode(10);
TreeNode t3=new TreeNode(5);
TreeNode t4=new TreeNode(3);
TreeNode t5=new TreeNode(8);
TreeNode t6=new TreeNode(7);
TreeNode t7=new TreeNode(9);
TreeNode t8=new TreeNode(15);
TreeNode t9=new TreeNode(17);
TreeNode t10=new TreeNode(40);
TreeNode t11=new TreeNode(13);
t1.left=t2;
t1.right=t10;
t2.left=t3;
t2.right=t8;
t8.left=t11;
t8.right=t9;
t3.left=t4;
t3.right=t5;
t5.left=t6;
t5.right=t7;
DeleteNodeInBST d=new DeleteNodeInBST();
System.out.println(d.delete(t1,5) );
System.out.println(d.delete(t1,9) );
System.out.println(d.delete(t1,3) );
}
}
二叉查找樹中刪除一個節點
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.