二叉樹(一) 概述(附二叉搜尋樹實現)

2021-10-25 12:15:55 字數 2250 閱讀 7884

樹和圖是典型的非線性資料結構

樹的定義:

樹是n(n>=0)個節點的有限集。當n=0時,成為空樹。在任意乙個非空樹中,有如下特點:

有且只有乙個特定的節點成為根節點

當n>1時,其餘節點可分為m(m>0)個互不相干的有限集,每個集合本身也是乙個樹,並成為根的子樹。

樹的最大層級數,稱為樹的高度或者深度
二叉樹的定義:

二叉樹的是指該樹的每個節點最多有2個子節點,有可能時兩個,也可能只有1個,或者是沒有

二叉樹的兩種特殊形式:

滿二叉樹:乙個二叉樹的所有非葉子節點都存在左孩子和右孩子,並且所有葉子節點都在同一層級上,這個樹就是滿二叉樹
完全二叉樹:乙個二叉樹的`最後乙個節點之前`

所有非葉子節點都存在左孩子和右孩子,並且所有葉子節點都在同一層級上

採用鍊錶的儲存結構,二叉樹的每乙個節點包含3個部分

使用陣列儲存時,會按照層級順序把二叉樹的節點放到陣列中對應的位置上。如果某乙個節點的左孩子或者右孩子空缺,則陣列的相應位置也空出來

為什麼這麼設計呢?因為這樣可以方便地在陣列中定位二叉樹的孩子節點和父節點

假設乙個父節點的下標是parent,那麼它的左孩子節點的下標就是2parent+1,右孩子節點的下標就是2parent+2。

反過來。假設乙個左孩子節點的下標是leftchild,那麼它的父節點下標就是(leftchild-1)/2

顯然,對於乙個稀疏的二叉樹來說,用陣列表示法是非常浪費空間的。

然而因為完全二叉樹的特殊性,用陣列來儲存是非常合適的,比如二叉堆,一種特殊的完全二叉樹

二叉樹有很多種的形式,除一般二叉樹外,由上面提到的滿二叉樹,完全二叉樹,還有二叉堆等等

那麼這麼多種的二叉樹有哪些作用呢?

用於查詢操作

維持元素間的相對順序

又名二叉排序樹,二叉搜尋樹等等。顧名思義,這種二叉樹的元素間有一定的順序,且方便查詢

定義:

如果左子樹不為空,則左子樹上所有節點的值均小於根節點的值如果右子樹不為空,則右子樹上所有節點的值均大於根節點的值左子樹和右子樹也都是二叉查詢樹

沒有鍵值相等的結點

golang實現二叉查詢樹:

package main

import

"fmt"

// 二叉樹

type binarytree struct

//二叉樹節點

type treenode struct

// 判斷二叉樹是否為空樹,只需要判斷第乙個元素是否是 nil

func (self *binarytree) isempty(

) bool

else

}// 在二叉查詢樹里新增資料

func (self *binarytree) add(value int32) bool

node := self.headnode

if node == nil

for node.data!=value else

}if value > node.data else }}

return

false

}// 查詢元素所在的節點

func (self *binarytree) get(value int32) *treenode

else

if value > node.data

else

}return nil

}func newbinarytree(

) binarytree

return binarytree

}func main(

)

二叉查詢樹的時間複雜度:

對於乙個節點分布相對均衡的二叉查詢樹來說,如果節點總數是n,那麼搜尋節點的時間複雜度是o(logn),和樹的深度是一樣的。

這種依靠比較大小來逐步查詢的方式,和二分查詢演算法非常相似

但對於極端情況(每次插入資料大小都是增大的,或者減小的),外形上看就只有一半的樹,查詢時間複雜度就會退化成o(n)的

為解決這個問題,涉及到二叉樹的自平衡,後面再介紹吧

二叉樹 還原二叉樹 二叉搜尋樹

先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...

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

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