資料結構之二叉樹

2021-10-07 03:47:34 字數 2853 閱讀 5793

二叉樹,指的是至多包含兩個子結點的樹結構。

陣列:查詢的複雜度為o(1),插入和刪除由於需要移位操作,因此複雜度為o(n);

鍊錶:插入和刪除操作只需要更換乙個結點,因此其複雜度為o(1),而遍歷則需要o(n)的複雜度;

二叉樹:以樹的結構來儲存資料,插入、刪除和查詢操作的複雜度均為o(log

2nlog_^

log2n​

)。順序儲存:空缺位置用#號替代,適合稠密儲存。當二叉樹接近滿二叉樹時效率較高。

鏈式儲存:最常用的儲存方式。

先序遍歷(preorder) :先遍歷根結點,再遍歷左孩子結點,最後再遍歷右孩子結點→[1, 2, 5, 6, 4]

中序遍歷(inorder) :先遍歷左孩子結點,再遍歷根結點,最後再遍歷右孩子結點→[5, 2, 6, 1, 4]

先序遍歷(postorder):先遍歷左孩子結點,再遍歷右孩子結點,最後再遍歷根結點→[5, 6, 2, 4, 1]

層次遍歷(levelorder):從上往下,從左到右依次遍歷→[1, 2, 4, 5, 6]

給定乙個二叉樹的,可以得到唯一的先序、中序和後序遍歷序列;

給定乙個二叉樹其中的乙個遍歷序列,無法確定一顆二叉樹;

由二叉樹的先序序列和中序序列、中序序列和後序序列以及層序序列和中序序列可以唯一的確定一棵二叉樹;但只給出先序序列和後序序列則無法確定唯一的一棵二叉樹;

class

node

(object):

def__init__

(self, x=

none):

self.value, self.left, self.right = x,

none

,none

class

binarytree

(object):

def__init__

(self)

: self.root = node(

) self.queue =

definsert_node

(self, x)

:# 插入乙個結點

node = node(x)

# 建立新結點

if self.root.value:

# 若根結點不為空,則輸出當前的根結點

temp = self.queue[0]

ifnot temp.left:

# 如果左子樹為空,則將當前結點新增到左子樹

temp.left = node

else

:# 否則新增到右子樹

temp.right = node

# 如果當前右子樹不為空,則彈出根結點,以便後續結點的新增

self.queue.pop(0)

else

:# 若根結點為空,則將當前結點新增到根結點上

self.root = node

defpreorder

(self, root, res)

:# 先序遍歷

if root:

self.preorder(root.left, res)

self.preorder(root.right, res)

return res

definorder

(self, root, res)

:# 中序遍歷

if root:

self.inorder(root.left, res)

self.inorder(root.right, res)

return res

defpostorder

(self, root, res)

:# 後續遍歷

if root:

self.postorder(root.left, res)

self.postorder(root.right, res)

return res

@staticmethod

deflevelorder

(root, res)

:# 層次遍歷

queue =

[root]

while queue:

curnode = queue.pop(0)

if curnode.left:

if curnode.right:

return res

defmain()

: tree = binarytree(

)for i in

range(7

):tree.insert_node(i+1)

preorder = tree.preorder(tree.root,

)print

("先序遍歷序列為:"

, preorder)

inorder = tree.inorder(tree.root,

)print

("中序遍歷序列為:"

, inorder)

postorder = tree.postorder(tree.root,

)print

("後序遍歷為:{}"

.format

(postorder)

) levelorder = tree.levelorder(tree.root,

)print

("層次遍歷為:{}"

.format

(levelorder)

)if __name__ ==

'__main__'

: main(

)

資料結構之二叉樹

在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...

資料結構之二叉樹

定義 滿足以下條件的就是樹 1.有且僅有乙個特定的稱為根root的結點。2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是乙個棵樹,並稱為根的子樹。樹是資料結構中一種常見的資料結構,比如我們排序中常見的二叉樹,紅黑樹等。最常見的是樹形表示法和廣義表表示法。樹的結構示意...

資料結構之二叉樹

來看一下樹的結構 class treenode public treenode string value 首先,為了方便後面看到效果,先手動初始化乙個有4個節點的二叉樹 tree tree new tree treenode root new treenode root treenode node1...