樹和圖是典型的非線性資料結構
樹的定義:
樹是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 若右子樹不空,則右子...