Python編寫二叉樹遍歷

二叉樹

樹的特徵和定義

  樹是一種重要的非線性數據結構,直觀來看,它是數據元素(在樹中稱爲結點)按分支關係組織起來的結構,很像自然界中的樹那樣,樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示,樹在計算機領域中也得到廣泛應用,如在編譯源程序時,可用樹表示源程序的語法結構,有如在數據庫系統中,樹型結構也是信息的重要組織形式之一,一切具有層次關係的問題都可用樹來描述。
在這裏插入圖片描述

樹的類型

(1)完全二叉樹——若設二叉樹的高度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹。
(2)滿二叉樹——除了葉結點外每一個結點都有左右子葉且葉子結點都處在最底層的二叉樹。
(3)平衡二叉樹——平衡二叉樹又被稱爲AVL樹(區別於AVL算法),它是一棵二叉排序樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

樹的相關術語:

樹的結點(node):包含一個數據元素及若干指向子樹的分支;
孩子結點(child node):結點的子樹的根稱爲該結點的孩子;
雙親結點:B 結點是A 結點的孩子,則A結點是B 結點的雙親;
兄弟結點:同一雙親的孩子結點; 堂兄結點:同一層上結點;
祖先結點: 從根到該結點的所經分支上的所有結點
子孫結點:以某結點爲根的子樹中任一結點都稱爲該結點的子孫
結點層:根結點的層定義爲1;根的孩子爲第二層結點,依此類推;
樹的深度:樹中最大的結點層
結點的度:結點子樹的個數
樹的度: 樹中最大的結點度。
葉子結點:也叫終端結點,是度爲 0 的結點;
分枝結點:度不爲0的結點;
有序樹:子樹有序的樹,如:家族樹;
無序樹:不考慮子樹的順序;

二叉搜索樹

二叉查找樹(Binary Search Tree),(又:二叉搜索樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別爲二叉排序樹。

二叉樹的遍歷

遍歷即將樹的所有結點訪問僅且訪問一次,按照根節點位置的不同分爲前序遍歷,中序遍歷,後序遍歷
前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後續遍歷:左子樹->右子樹->根節點

程序示例:

"""
題目:二叉樹遍歷
version:1.0
作者:假書生@
date:2020.01.30
"""
class treenode(object):   #定義創建樹的類
    def __init__(self,data = 0,left = 0,right = 0):
        self.data = data
        self.left = left
        self.right = right
class Btree(object):      # 定義搜索樹的類
    def __init__(self,root = 0):
        self.root = root
    def preOrder(self,treenode):    # 前序遍歷
        if  treenode is 0 :     # 如果是葉子結點,則退出
            return
        print(treenode.data)    #輸出根節點
        self.preOrder(treenode.left)  # 遍歷左子樹
        self.preOrder(treenode.right)    # 遍歷右子樹
    def inOrder(self,treenode):    # 中序遍歷
        if treenode is 0 :    # 如果是葉子結點,則退出
            return
        self.inOrder(treenode.left)   # 遍歷左子樹
        print(treenode.data)         #輸出根節點
        self.inOrder(treenode.right)   # 遍歷右子樹
    def postOrder(self,treenode):   # 後序遍歷
        if treenode is 0 :   # 如果是葉子結點,則退出
            return
        self.postOrder(treenode.left)   # 遍歷左子樹
        self.postOrder(treenode.right)  # 遍歷右子樹
        print(treenode.data)              #輸出根節點
n1 = treenode(data=1)
n2 = treenode(2,n1,0)
n3 = treenode(3)
n4 = treenode(4)
n5 = treenode(5,n3,n4)
n6 = treenode(6,n2,n5)
n7 = treenode(7,n6,0)
n8 = treenode(8)
root = treenode('root',n7,n8)
bt = Btree(root)
print("preOrder".center(50,'-'))   # 前序遍歷
print(bt.preOrder(bt.root))

print("inOrder".center(50,'-'))   # 中序遍歷
print(bt.inOrder(bt.root))

print("postOrder".center(50,'-'))  # 後序遍歷
print(bt.postOrder(bt.root))

運行結果:

---------------------preOrder---------------------
root
7
6
2
1
5
3
4
8
None
---------------------inOrder----------------------
1
2
6
3
5
4
7
root
8
None
--------------------postOrder---------------------
1
2
3
4
5
6
7
8
root
None

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章