二叉排序樹定義:
1. 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2. 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3. 它的左、右子樹也分別為二叉排序樹。
二叉排序樹的常用方法:
新增結點:類似二叉樹
遍歷:所有遍歷和普通二叉樹一樣
刪除結點:重點!!!!
1.刪除葉子節點
思路:(1)找到要刪除的結點:targetnode
(2)找到targetnode的父結點parent
(3)確定targetnode是parent的左子結點還是右子結點
(4)根據情況進行刪除
2.刪除只有一顆子樹的結點
思路:(1)找到要刪除的結點:targetnode
(2)找到targetnode的父結點parent
(3)確定targetnode的子樹是左子樹還是右子樹
(4)確定targetnode是parent的左子結點還是右子結點
(5)如果targetnode只有左子樹
因為targetnode的左子樹都小於targetnode的值,其中最大的就是targetnode.left(即所有小的中挑大的)
5.1 如果targetnode是parent的左子結點
parent.left=target.left
5.2 如果targetnode是parent的右子結點
parent.right=targetnode.left
(6)如果targetnode只有右子樹
因為targetnode的右子樹都大於targetnode的值,其中最小的就是targetnode.right(即所有大的中挑小的)
6.1 如果targetnode是parent的左子結點
parent.left=targetnode.right
6.2 如果targetnode是parent的右子結點
parent.right=targetnode.right
總結:刪除只有一顆子樹的結點,在該結點的子樹中找到可以替代該子樹的結點,替換掉即可
3.刪除有兩棵子樹的結點
思路:(1)找到要刪除的結點targetnode
(2)找到targetnode的父結點parent
(3)從targetnode的右子樹找到最小的結點
(4)建立臨時變數temp儲存最小結點的值
(5)刪除最小結點
(6)targetnode.value=temp
思路:刪除有兩顆子樹的結點。首先該結點肯定是大於左邊所有結點且小於右邊所有結點(即中間值)
找到最接近該結點的值的結點替代要刪除的結點即可(左邊結點中最大的或者右邊結點中最小的)
完整**如下:對於**應該認真體會找父結點,遞迴等思想的實現
//構造結點
public
class
node
//查詢要刪除的結點
public node search(int
value)
else
if (value < this
.value)
return
this
.left.search(value);
}else
return
this
.right.search(value);}}
//查詢要刪除結點的父結點
public node searchparent(int
value)
else
//如果要查詢的值大於當前結點的值,且當前結點的右子結點不為空
else
if (value >= this.value && this.right != null
)
//沒有父結點
else}}
public
void
add(node node)
//判斷傳入的結點值和當前子樹根結點的關係
//當前結點的值大於傳入的值
if (node.value < this
.value)
else
//如果左子樹不為空
}else
//傳入的值大於等於當前結點的值
//右子樹不為空
else}}
public
void
midorder()
console.writeline(
this
.tostring());
if (right != null
)
}public
string
tostring()
}//構造二叉排序樹
public
class
binarysorttree
else
}//中序遍歷
public
void
midorder()
else
}//查詢要刪除的結點
public node search(int
value)
else
}//查詢要刪除結點的父結點
public node searchparent(int
value)
else
}//刪除結點
public
void delnode(int
value)
else
//如果這顆二叉排序樹只有乙個結點
if(root.left==null&&root.right==null
)
//去查詢targetnode的父結點
node parent =searchparent(value);
//刪除的是葉子節點
if(targetnode.left==null&&targetnode.right==null
)
//要刪除結點是父結點的右子結點
else
if(parent.right!=null&&parent.right.value==value)
}//刪除兩顆子樹的結點
else
if(targetnode.left!=null&&targetnode.right!=null
)
//刪除只有一顆子樹的結點
else
else
//target是parent的右子結點
}else
}else
//要刪除的結點有右子結點
else
//target是parent的右子結點
}else}}
}}
//找到以node結點為根節點的二叉排序樹最小結點的值,並刪除
public
intmin(node node)
//target指向了最小結點,並刪除
delnode(target.value);
return
target.value;
}}
二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為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 ...