二叉排序樹

2021-09-24 22:20:59 字數 2473 閱讀 4947

陣列刪除和插入的效率很低,鍊錶查詢的效率很低,而二叉排序樹可以讓查詢,刪除,新增(因為二叉排序樹是有序的,所以新增也即是插入)的效率都變的很高。

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 ...