樹的實現

樹的術語
節點的度:一個節點含有的子樹的個數稱爲該節點的度;
樹的度:一棵樹中,最大的節點的度稱爲樹的度;
葉節點或終端節點:度爲零的節點;
父親節點或父節點:若一個節點含有子節點,則這個節點稱爲其子節點的父節點;
孩子節點或子節點:一個節點含有的子樹的根節點稱爲該節點的子節點;
兄弟節點:具備相同父節點的節點互稱爲兄弟節點;
節點的層次:從根開始定義起,根爲第1層,根的子節點爲第2層,以此類推;
樹的高度或深度:樹中節點的最大層次;
堂兄弟節點:父節點在同一層的節點互爲堂兄弟;
節點的祖先:從根到該節點所經分支上的全部節點;
子孫:以某節點爲根的子樹中任一節點都稱爲該節點的子孫。
森林:由mm>=0)棵互不相交的樹的集合稱爲森林;
樹的種類
無序樹:樹中任意節點的子節點之間沒有順序關係,這種樹稱爲無序樹,也稱爲自由樹;
有序樹:樹中任意節點的子節點之間有順序關係,這種樹稱爲有序樹;
二叉樹:每一個節點最多含有兩個子樹的樹稱爲二叉樹;
徹底二叉樹:對於一顆二叉樹,假設其深度爲d(d>1)。除了第d層外,其它各層的節點數目均已達最大值,且第d層全部節點從左向右連續地緊密排列,這樣的二叉樹被稱爲徹底二叉樹,其中滿二叉樹的定義是全部葉節點都在最底層的徹底二叉樹;
平衡二叉樹(AVL樹):當且僅當任何節點的兩棵子樹的高度差不大於1的二叉樹;
排序二叉樹(二叉查找樹(英語:Binary Search Tree),也稱二叉搜索樹、有序二叉樹);
霍夫曼樹(用於信息編碼):帶權路徑最短的二叉樹稱爲哈夫曼樹或最優二叉樹;
B樹:一種對讀寫操做進行優化的自平衡的二叉查找樹,可以保持數據有序,擁有多餘兩個子樹。
# 二叉樹
class Node(object):
    """節點類"""
    def __init__(self, elem=-1, lchild=None, rchild=None):
        self.elem = elem
        self.lchild = lchild
        self.rchild = rchild

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 = []
            queue.append(self.root)
            # 對已有的節點進行層次遍歷
            while queue:
                # 彈出隊列的第一個元素
                cur = queue.pop(0)
                if cur.lchild == None:
                    cur.lchild = node
                    return
                elif cur.rchild == None:
                    cur.rchild = node
                    return
                else:
                    # 若是左右子樹都不爲空,加入隊列繼續判斷
                    queue.append(cur.lchild)
                    queue.append(cur.rchild)


    def breadth_travel(self):
        """利用隊列實現樹的層次遍歷:廣度優先遍歷"""
        if self.root == None:
            return
        queue = [self.root]
        while queue:
            node = queue.pop(0)
            print(node.elem, end=' ')
            if node.lchild != None:
                queue.append(node.lchild)
            if node.rchild != None:
                queue.append(node.rchild)

    def preorder(self, root):
        """遞歸實現先序遍歷"""
        if root == None:
            return
        print(root.elem, end=' ')
        self.preorder(root.lchild)
        self.preorder(root.rchild)

    def inorder(self, root):
        """遞歸實現中序遍歷"""
        if root == None:
            return
        self.inorder(root.lchild)
        print(root.elem, end=' ')
        self.inorder(root.rchild)

    def postorder(self, root):
        """遞歸實現後續遍歷"""
        if root == None:
            return
        self.postorder(root.lchild)
        self.postorder(root.rchild)
        print(root.elem, end=' ')
相關文章
相關標籤/搜索