1. 程式人生 > >二叉樹相關基礎知識總結

二叉樹相關基礎知識總結

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 0
View Code

圖解:

技術分享圖片

二叉樹相關基礎知識總結