陣列刪除和插入的效率很低,鍊錶查詢的效率很低,而二叉排序樹可以讓查詢,刪除,新增(因為二叉排序樹是有序的,所以新增也即是插入)的效率都變的很高。
public class treenode
//新增節點
public void add(treenode node)
if(node.value < this.value) else
}else else
} }//中序遍歷
public void midorder()
system.out.println(this);
if(this.right != null)
} //查詢目標節點
public treenode search(int value) else if(value < this.value) else
}else else
} }/**
* 查詢目標值的父節點
* 實現:判斷當前節點的左右子節點是否是要查詢的節點,如果是直接返回
* 如果不是,則判斷當前節點值與要查詢的值的大小關係
* 如果 要查詢的值《當前值 判斷左子節點是否為空,不為空則往左邊查詢
* 如果 要查詢的值》當前值 判斷右子節點是否為空,不為空則往右邊查詢
* * @param value 要刪除節點的值
* @return 返回目標值的父節點
*/public treenode searchparent(int value) else else if(value > this.value && this.left != null) else
} }}
public class binarysorttree else
} //中序遍歷
public void midorder() else
} //查詢節點
public treenode search(int value) else
} //查詢目標節點的父節點
public treenode searchparent(int value) else
} /**
* 先查詢目標節點的父節點,如果找到,則可以同時得到目標節點
* 如果找不到,則判斷是否目標節點是否是根節點,如果不是,則沒有目標節點,直接返回
* 找到目標節點後:
* 1.判斷該節點是否是葉子節點,如果是,則直接通過父節點刪除,如果是根節點,則直接把根節點賦值為null
* 2.判斷該節點後面是否只有一顆子樹,也就是左子節點或者右子節點其中乙個為null,則直接把讓目標節點的父節點指向目標節點的子節點
* 如果是根節點,則讓根節點等於它的左子節點或者右子節點(非空的那個節點)
* 3.如果該節點後面有兩顆子樹,也就是做左右子節點都不為null,
* 則找到以左子節點為根的子樹中最大的數儲存起來,刪除該節點,然後把值賦值給要目標節點
* 或者找到以右子節點為根的子樹中最小的數儲存起來,刪除該節點,然後把值賦值給要刪除的節點 (兩者選其一)
* * @param value 要刪除的節點值
*/public void removenode(int value) else else
}else if(parentnode.left != null && parentnode.left.value == value)else if(parentnode.right != null && parentnode.right.value == value)
//如果要刪除的節點為葉子節點
if(target.left == null && target.right == null)
//判斷目標節點是父節點的左子節點還是右子節點
if(parentnode.left != null && parentnode.left.value == value)
if(parentnode.right != null && parentnode.right.value == value)
}else if(target.left != null && target.right != null)else
if(parentnode.left.value == value) else
}else
if(parentnode.left.value == value) else }}
} }/**
* 刪除二叉排序子樹中節點值最小的節點
* @param node 該子樹的根節點
* @return 返回刪除節點的值
*/public int removerightmin(treenode node)
int rightminvalue = temp.value;
removenode(rightminvalue);
return rightminvalue;
}}
二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...
二叉排序樹
name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...
二叉排序樹
include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...