定義的二叉樹結構爲:
/*
* public class TreeNode {* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
建立二叉查找樹時,對根節點的操作與對子節點的操作步驟稍微有點差別,大家可以通過代碼看出來
TreeNode r ;
public void insertTree(TreeNode root, int x){
if(root ==null){
r = new TreeNode(x);//創建父節點
}
else{
if(x <= root.val){
if(root.left == null){
root.left = new TreeNode(x);
}
else{
insertTree(root.left,x);
}
}
else{
if(root.right == null){
root.right = new TreeNode(x);
}
else{
insertTree(root.right,x);
}
}
}
}
刪除二叉樹時,分三種情況,當你要刪除的那個節點有三種情況,第一種:要刪除的節點沒有子女;第二種,要刪除的節點只有一個子女;第三種,要刪除的節點有兩個子女;
在這裏刪除5之後應該變成:
刪除13是直接刪除,刪除16是將其父節點指向它的節點指向它的右孩子(具體圖形這裏就不給出了)
public void delete_tree(TreeNode root,int x){
TreeNode q = root ;
TreeNode p = root;
/*
* 先找出要刪除節點的位置
*/
while(p != null){
if(p.val > x){
q = p;
p = p.left;
}
else if(p.val < x){
q = p;
p = p.right;
}
else{
break;
}
}
//當節點沒有子女的時候,應該直接去掉該節點
if(p.left == null && p.right == null){
if(q.left == p){
q.left = null;
}
else{
q.right = null;
}
}
//當節點只有一個子女的時候,應該用其父節點直接指向其子女節點(兩種情況)
if(p.left == null && p.right != null ){
if(q.left == p){
q.left = p.right;
}
else{
q.right = p.right;
}
}
if(p.left != null && p.right == null){
if(q.left == p){
q.left = p.left;
}
else{
q.right = p.left;
}
}
if(p.left != null && p.right != null){
TreeNode tt = Tree_SS(p);//求得p節點的後繼節點
delete_tree(root,tt.val);
p.val = tt.val;
}
}
關於如何求取後繼節點呢?要求一個二叉查找樹節點的後繼節點,應該要求其右子樹中的最小節點,具體實現這裏就不細說了。