資料結構與演算法 二叉樹

2021-09-10 03:31:41 字數 1793 閱讀 6018

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)

性質1:在二叉樹的第i層上至多有2^(i-1)個結點(i>0)

性質2:深度為k的二叉樹至多有2^k - 1個結點(k>0)

性質3:對於任意一棵二叉樹,如果其葉結點數為n0,而度數為2的結點總數為n2,則n0=n2+1;

性質4:具有n個結點的完全二叉樹的深度必為 log2(n+1)

性質5:對完全二叉樹,若從上至下、從左至右編號,則編號為i 的結點,其左孩子編號必為2i,其右孩子編號必為2i+1;其雙親的編號必為i/2(i=1 時為根,除外)

完全二叉樹滿二叉樹

(1)完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹

(2)滿二叉樹——除了葉結點外每乙個結點都有左右子葉且葉子結點都處在最底層的二叉樹

通過使用node類中定義三個屬性,分別為elem本身的值,還有lchild左孩子和rchild右孩子

class node(object):

"""節點類"""

def __init__(self, elem=-1, lchild=none, rchild=none):

self.elem = elem

self.lchild = lchild

self.rchild = rchild

樹的建立,建立乙個樹的類,並給乙個root根節點,一開始為空,隨後新增節點

這裡我們用了乙個佇列,來存放每個節點,從根節點開始,通過判斷節點是否為none 來新增最新的子節點

若一開始根節點為none,那麼新增的節點就直接置為根節點,如果不為none,依次判斷其左子樹和右子樹是否為none,再往其下新增最新的節點

詳細**示例如下:

class tree(object):

"""樹類"""

def __init__(self, root=none):

self.root = root

def add(self, elem):

"""為樹新增節點"""

node = node(elem)

#如果樹是空的,則對根節點賦值

if self.root == none:

self.root = node

else:

queue =

#對已有的節點進行層次遍歷

while queue:

#彈出佇列的第乙個元素

cur = queue.pop(0)

if cur.lchild == none:

cur.lchild = node

return

elif cur.rchild == none:

cur.rchild = node

return

else:

#如果左右子樹都不為空,加入佇列繼續判斷

演算法與資料結構 二叉樹

二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...

資料結構與演算法 二叉樹

1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...

演算法與資料結構 二叉樹

樹是一種特殊的資料型別,模擬具有樹狀結構的數的集合 樹的特點 每個節點都有零個或多個子節點 沒有父節點的節點為根節點 每乙個非根節點有且只有乙個父節點 除了根節點外,每個子節點可以分為多個不想交的子樹 樹的術語 節點的度 某個節點所分出的下一級子節點的個數 樹的度 所有節點中,最大的節點的度即為數的...