二叉排序樹

2022-06-16 08:12:10 字數 3592 閱讀 2845

二叉排序樹定義:

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