python資料結構之二叉樹的遍曆執行個體_python

來源:互聯網
上載者:User

遍曆方案
    從二叉樹的遞迴定義可知,一棵非空的二叉樹由根結點及左、右子樹這三個基本部分組成。因此,在任一給定結點上,可以按某種次序執行三個操作:
    1).訪問結點本身(N)
    2).遍曆該結點的左子樹(L)
    3).遍曆該結點的右子樹(R)

有次序:
    NLR、LNR、LRN

遍曆的命名

    根據訪問結點操作發生位置命名:
NLR:前序走訪(PreorderTraversal亦稱(先序遍曆))  ——訪問結點的操作發生在遍曆其左右子樹之前。
LNR:中序遍曆(InorderTraversal)  ——訪問結點的操作發生在遍曆其左右子樹之中(間)。
LRN:後序遍曆(PostorderTraversal)    ——訪問結點的操作發生在遍曆其左右子樹之後。

註:由於被訪問的結點必是某子樹的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解釋為根、根的左子樹和根的右子樹。NLR、LNR和LRN分別又稱為先根遍曆、中根遍曆和後根遍曆。

遍曆演算法

1).先序遍曆的遞迴演算法定義:
若二叉樹非空,則依次執行如下操作:
a.訪問根結點
b.遍曆左子樹
c.遍曆右子樹

2).中序遍曆的遞迴演算法定義:
若二叉樹非空,則依次執行如下操作:
a.遍曆左子樹
b.訪問根結點
c.遍曆右子樹

3).後序遍曆得遞迴演算法定義:
若二叉樹非空,則依次執行如下操作:
a.遍曆左子樹
b.遍曆右子樹
c.訪問根結點

一、二叉樹的遞迴遍曆:

複製代碼 代碼如下:

# -*- coding: utf - 8 - *-

class TreeNode(object):

    def __init__(self, left=0, right=0, data=0):
        self.left = left
        self.right = right
        self.data = data

     
class BTree(object):

    def __init__(self, root=0):
        self.root = root

    def is_empty(self):
        if self.root is 0:
            return True
        else:
            return False

    def preorder(self, treenode):
        '前序(pre-order,NLR)遍曆'
        if treenode is 0:
            return
        print treenode.data
        self.preorder(treenode.left)
        self.preorder(treenode.right)

    def inorder(self, treenode):
        '中序(in-order,LNR'
        if treenode is 0:
            return
        self.inorder(treenode.left)
        print treenode.data
        self.inorder(treenode.right)

    def postorder(self, treenode):
        '後序(post-order,LRN)遍曆'
        if treenode is 0:
            return
        self.postorder(treenode.left)
        self.postorder(treenode.right)
        print treenode.data

     
node1 = TreeNode(data=1)
node2 = TreeNode(node1, 0, 2)
node3 = TreeNode(data=3)
node4 = TreeNode(data=4)
node5 = TreeNode(node3, node4, 5)
node6 = TreeNode(node2, node5, 6)
node7 = TreeNode(node6, 0, 7)
node8 = TreeNode(data=8)
root = TreeNode(node7, node8, 'root')

bt = BTree(root)

print u'''

#產生的二叉樹

# ------------------------
#          root
#       7        8
#     6
#   2   5
# 1    3 4
#
# -------------------------

'''
print '前序(pre-order,NLR)遍曆 :\n'
bt.preorder(bt.root)

print '中序(in-order,LNR) 遍曆 :\n'
bt.inorder(bt.root)

print '後序(post-order,LRN)遍曆 :\n'
bt.postorder(bt.root)


二、.二叉樹的非遞迴遍曆

下面就用非遞迴的方式實現一遍。主要用到了 stack 和 queue維護一些資料節點:

複製代碼 代碼如下:

# -*- coding: utf - 8 - *-

     
class TreeNode(object):

    def __init__(self, left=0, right=0, data=0):
        self.left = left
        self.right = right
        self.data = data

     
class BTree(object):

    def __init__(self, root=0):
        self.root = root

    def is_empty(self):
        if self.root is 0:
            return True
        else:
            return False

    def preorder(self, treenode):
        '前序(pre-order,NLR)遍曆'
        stack = []
        while treenode or stack:
            if treenode is not 0:
                print treenode.data
                stack.append(treenode)
                treenode = treenode.left
            else:
                treenode = stack.pop()
                treenode = treenode.right

    def inorder(self, treenode):
        '中序(in-order,LNR) 遍曆'
        stack = []
        while treenode or stack:
            if treenode:
                stack.append(treenode)
                treenode = treenode.left
            else:
                treenode = stack.pop()
                print treenode.data
                treenode = treenode.right

    # def postorder(self, treenode):
    #     stack = []
    #     pre = 0
    #     while treenode or stack:
    #         if treenode:
    #             stack.append(treenode)
    #             treenode = treenode.left
    #         elif stack[-1].right != pre:
    #             treenode = stack[-1].right
    #             pre = 0
    #         else:
    #             pre = stack.pop()
    #             print pre.data

    def postorder(self, treenode):
        '後序(post-order,LRN)遍曆'
        stack = []
        queue = []
        queue.append(treenode)
        while queue:
            treenode = queue.pop()
            if treenode.left:
                queue.append(treenode.left)
            if treenode.right:
                queue.append(treenode.right)
            stack.append(treenode)
        while stack:
            print stack.pop().data

    def levelorder(self, treenode):
        from collections import deque
        if not treenode:
            return
        q = deque([treenode])
        while q:
            treenode = q.popleft()
            print treenode.data
            if treenode.left:
                q.append(treenode.left)
            if treenode.right:
                q.append(treenode.right)

     
node1 = TreeNode(data=1)
node2 = TreeNode(node1, 0, 2)
node3 = TreeNode(data=3)
node4 = TreeNode(data=4)
node5 = TreeNode(node3, node4, 5)
node6 = TreeNode(node2, node5, 6)
node7 = TreeNode(node6, 0, 7)
node8 = TreeNode(data=8)
root = TreeNode(node7, node8, 'root')

     
bt = BTree(root)

print u'''

#產生的二叉樹

# ------------------------
#          root
#       7        8
#     6
#   2   5
# 1    3 4
#
# -------------------------

'''
print '前序(pre-order,NLR)遍曆 :\n'
bt.preorder(bt.root)

print '中序(in-order,LNR) 遍曆 :\n'
bt.inorder(bt.root)

print '後序(post-order,LRN)遍曆 :\n'
bt.postorder(bt.root)

print '層序(level-order,LRN)遍曆 :\n'
bt.levelorder(bt.root)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.