資料結構與演算法(十三)刪除二叉樹結點

2021-07-31 12:36:15 字數 1858 閱讀 6492

刪除二叉樹結點

刪除結點是二叉樹操作中最複雜的。在刪除之前首先要查詢要刪除的結點。找到結點後,這個要刪除的結點可能會有三種情況需要考慮。

1. 該節點是葉子結點,沒有子結點

要刪除葉子結點,只需要改變該節點的父結點的引用值,將指向該節點的引用值設定為null就可以了。

2. 該節點有乙個子結點

改變父結點的引用,將其直接指向要刪除結點的子結點。

3. 該節點有兩個子結點

要刪除有兩個子結點的結點,就需要使用它的中序後繼來替代該節點。

二叉樹結點

/*

* 二叉樹結點

*/public class node

}

二叉樹類

* 二叉樹類

*//*

* 為什麼要使用樹

* * 有序陣列插入資料項和刪除資料項太慢

* 鍊錶查詢資料太慢

* 在樹中能非常快速的查詢資料項、刪除資料項和插入資料項

*/public class tree else

}else}}

}

} /* * 查詢結點

*/public node find(long value)else

//如果找不到

if(current==null)

} return current;

} /*

* 刪除結點

* * 1 該節點是葉子節點,沒有子節點

* 要刪除葉結點,只需要改變該節點的父結點的引用值,將指向該節點的引用設定為null就可以了

* * 2 該節點有乙個子節點

* 改變父結點的引用,將其直接指向要刪除結點的子節點

* * 3 該節點有兩個子節點

* 要刪除有兩個子節點的結點,就需要使用它的中序後繼來代替該節點

* */

public boolean delete(long value)else

//如果找不到

if(current==null)

} //刪除葉子結點,也即該節點沒有子結點

if(current.leftchild==null&¤t.rightchild==null)

//如果它是父結點的左子結點

else if(isleftchild)else

}else if(current.rightchild==null)

else if(isleftchild)else

}else if(current.leftchild==null)

else if(isleftchild)else

}elseelse if(isleftchild)else

successor.leftchild=current.leftchild;

}return true;

}public node getsuccessor(node delnode)

if(successor!=delnode.rightchild)

return successor;

} /*

* 前序遍歷

*/public void frontorder(node localnode)

} /*

* 中序遍歷

*/public void inorder(node localnode)

} /*

* 後序遍歷

*/public void afterorder(node localnode)

}}

測試:

public class testtree 

}

演算法與資料結構 二叉樹

二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...

資料結構與演算法 二叉樹

1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...

資料結構與演算法 二叉樹

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 性質1 在二叉樹的第i層上至多有2 i 1 個結點 i 0 性質2 深度為k的二叉樹至多有2 k 1個結點 k 0 性質3 對於任意一棵二叉樹,如果其葉結點數為n0,而度...