排序二叉樹是一種如下定義的樹:
(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 若右子樹不空,則右子...