排序二叉樹

2021-09-24 04:57:46 字數 1960 閱讀 1377

排序二叉樹是一種如下定義的樹:

(1)根結點的值比它的左子樹上的任意乙個結點的值都要大。

(2)根結點的值比它的左子樹上的任意乙個結點的值都要小。

(3)根的左子樹和右子樹也滿足上述性質。

排序二叉樹的先序遍歷可以得到資料的公升序序列。

構造排序二叉樹的過程相對簡單.

1 .從根結點開始,判斷當前節點是否為空,若為空則執行插入操作。若非空則轉第2步。

2.若根結點的值大於(小於)需要插入的值,遞迴根結點的左(右)孩子,轉第1步。

void

insert_data

(node *

&head ,

int value)

else

}

排序二叉樹的刪除相比麻煩,因為有多種情況要考慮。

(1)最簡單的情況:需要刪除的結點時葉子結點(沒有任何孩子),則直接刪除

(2)需要刪除的結點有乙個孩子,那麼讓其父結點對應的指標指向被刪除結點的孩子即可。

(3)需要刪除的結點有兩個孩子,那麼可以如下操作:在兩個孩子中選擇乙個作為父結點,將另乙個孩子放到它的子樹中。

注:(1)筆者使用了迴圈的方法來查詢對應元素,沒有使用遞迴。

(2)根節點和非根節點分開討論了,所以**有點長。

(3)關於前面的選擇,筆者通過判斷左孩子的右深度和右孩子的左深度,選取深度小的為新的父結點。將深度大的拼接至深度小的結點的子樹中。

//該結構體用來返回深度的值和最深處的結點

struct node_and_depth

;

//獲得結點的右深度

void

letf_big_depth

(node *d,node_and_depth *r)

}//獲取結點的左深度

void

right_small_depth

(node *d,node_and_depth *r)

}

上面的**如果不考慮選擇的問題,可以無視。

注意,因為懶~~所以所有情況都使用return語句作為退出口(沒有使用遞迴),可能講究**規範的人會很惱火。。。

struct node*

delete_data

(node *head,

int value)

//按值刪除結點

node * father =

null

;//指向當前結點的父節點

while

(head-

>data != value)

//通過迴圈找到對應節點}if

(father ==

null

)//刪除的是根節點

else

return p;

}else

else

else}}

}if(head-

>left ==

null

&& head-

>right ==

null

)//刪除的是葉子結點

else

return p;}if

(head-

>left !=

null

&& head-

>right !=

null

)//刪除的結點同時有左孩子和右孩子

else

}else

else

}return p;

}//下面是只有乙個孩子的

if(father-

>left-

>data == head-

>data)

//確定該節點是父節點的左孩子還是右孩子

else

}else

else

}return p;

}

如有錯誤,歡迎指正!

二叉樹,排序二叉樹

說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...

排序二叉樹or搜尋二叉樹or查詢二叉樹

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...

排序二叉樹or搜尋二叉樹or查詢二叉樹

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...