二叉樹相關基礎知識總結
阿新 • • 發佈:2018-12-30
block spa play 概念 中序 森林 sel 就是 ima
無序樹:樹中任意節點的子結點之間沒有順序關系,這種樹稱為無序樹,也稱為自由樹;
有序樹:樹中任意節點的子結點之間有順序關系,這種樹稱為有序樹;
二叉樹:每個節點最多含有兩個子樹的樹稱為二叉樹;
完全二叉樹
滿二叉樹
霍夫曼樹:帶權路徑最短的二叉樹稱為哈夫曼樹或最優二叉樹;
一:樹的概念
樹是一種數據結構,它是由n(n>=1)個有限結點組成一個具有層次關系的集合。把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點: 1:每個結點有零個或多個子結點; 2:沒有父結點的結點稱為根結點; 3:每一個非根結點有且只有一個父結點; 4:除了根結點外,每個子結點可以分為多個不相交的子樹二:樹相關術語
節點的度:一個節點含有的子樹的個數稱為該節點的度; 葉節點或終端節點:度為0的節點稱為葉節點; 非終端節點或分支節點:度不為0的節點; 雙親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點; 孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點; 兄弟節點:具有相同父節點的節點互稱為兄弟節點; 樹的度:一棵樹中,最大的節點的度稱為樹的度; 節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推; 樹的高度或深度:樹中節點的最大層次; 堂兄弟節點:雙親在同一層的節點互為堂兄弟; 節點的祖先:從根到該節點所經分支上的所有節點; 子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。 森林:由m(m>=0)棵互不相交的樹的集合稱為森林;三:樹的種類
四:二叉樹
定義:在計算機科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。
二叉樹的節點表示以及樹的構建:
class Node: """二叉樹節點類""" def __init__(self, item): self.value = item self.lchild = None self.rchild = None class Tree: """二叉樹""" def __init__(self): self.root = None def add(self, item): node = Node(item) if self.root == None: self.root= node return queue = [self.root] while queue: cur_node = queue.pop(0) if cur_node.lchild is None: cur_node.lchild = node return else: queue.append(cur_node.lchild) if cur_node.rchild is None: cur_node.rchild = node return else: queue.append(cur_node.rchild)
五:二叉樹遍歷
一:層次遍歷
即按照層次訪問,通常用隊列來做。訪問根,訪問子女,再訪問子女的子女
二:先序遍歷
我們先訪問根節點,然後遞歸使用先序遍歷去訪問左子樹,再遞歸使用先序遍歷訪問右子樹 (根節點 左子樹 右子樹)
三:中序遍歷
我們遞歸使用中序遍歷去訪問左子樹,然後訪問根節點,再遞歸使用中序遍歷訪問右子樹 (左子樹 根節點 右子樹)
四:後序遍歷
我們遞歸使用後序遍歷去訪問左子樹,然後遞歸使用後序遍歷訪問右子樹,再訪問根節點 (左子樹 右子樹 根節點)
代碼實現:
class Node: """二叉樹節點類""" def __init__(self, item): self.value = item self.lchild = None self.rchild = None class Tree: """二叉樹""" def __init__(self): self.root = None def add(self, item): node = Node(item) if self.root == None: self.root = node return queue = [self.root] while queue: cur_node = queue.pop(0) if cur_node.lchild is None: cur_node.lchild = node return else: queue.append(cur_node.lchild) if cur_node.rchild is None: cur_node.rchild = node return else: queue.append(cur_node.rchild) def level_travel(self): """層次遍歷,廣度優先 從樹的根節點開始 從上到下從左到右遍歷整個樹的節點 """ if self.root is None: return queue = [self.root] print(self.root.value, end=‘ ‘) while queue: cur_node = queue.pop(0) if cur_node.lchild is not None: print(cur_node.lchild.value, end=‘ ‘) queue.append(cur_node.lchild) if cur_node.rchild is not None: print(cur_node.rchild.value, end=‘ ‘) queue.append(cur_node.rchild) def pre_order(self, node): """先序遍歷""" if node is None: return print(node.value, end=‘ ‘) self.pre_order(node.lchild) self.pre_order(node.rchild) def inorder(self, node): """中序遍歷""" if node is None: return self.inorder(node.lchild) print(node.value, end=‘ ‘) self.inorder(node.rchild) def postorder(self, node): """後序遍歷""" if node is None: return self.postorder(node.lchild) self.postorder(node.rchild) print(node.value, end=‘ ‘) tree = Tree() tree.add(0) tree.add(1) tree.add(2) tree.add(3) tree.add(4) tree.add(5) tree.add(6) tree.add(7) tree.add(8) tree.add(9) tree.breadth_travel() # 0 1 2 3 4 5 6 7 8 9 print(‘‘) tree.pre_order(tree.root) # 0 1 3 7 8 4 9 2 5 6 print(‘‘) tree.inorder(tree.root) # 7 3 8 1 9 4 0 5 2 6 print(‘‘) tree.postorder(tree.root) # 7 8 3 9 4 1 5 6 2 0View Code
圖解:
二叉樹相關基礎知識總結