python數據結構之樹和二叉樹(先序遍歷、中序遍歷和後序遍歷)

python數據結構之樹和二叉樹(先序遍歷、中序遍歷和後序遍歷)

樹是\(n\)\(n\ge 0\))個結點的有限集。在任意一棵非空樹中,有且只有一個根結點。python

二叉樹是有限個元素的集合,該集合或者爲空、或者有一個稱爲根節點(root)的元素及兩個互不相交的、分別被稱爲左子樹和右子樹的二叉樹組成。數據結構

  • 二叉樹的每一個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。
  • 二叉樹的第i層至多有2^{i-1}個結點
  • 深度爲k的二叉樹至多有2^k-1個結點;
  • 對任何一棵二叉樹T,若是其終端結點數爲N0,度爲2的結點數爲N2,則N0=N2+1

例子

實現如下二叉樹,並進行先序遍歷、中序遍歷和後序遍歷。
post

class BinaryTreeNode(object):
    def __init__(self, data=None, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

class BinaryTree(object):
    def __init__(self, root=None):
        self.root = root

    def is_empty(self):
        return self.root == None

    def preOrder(self,BinaryTreeNode):
        if BinaryTreeNode == None:
            return
        # 先打印根結點,再打印左結點,後打印右結點
        print(BinaryTreeNode.data)
        self.preOrder(BinaryTreeNode.left)
        self.preOrder(BinaryTreeNode.right)

    def inOrder(self,BinaryTreeNode):
        if BinaryTreeNode == None:
            return
        # 先打印左結點,再打印根結點,後打印右結點
        self.inOrder(BinaryTreeNode.left)
        print(BinaryTreeNode.data)
        self.inOrder(BinaryTreeNode.right)

    def postOrder(self,BinaryTreeNode):
        if BinaryTreeNode == None:
            return
        # 先打印左結點,再打印右結點,後打印根結點
        self.postOrder(BinaryTreeNode.left)
        self.postOrder(BinaryTreeNode.right)
        print(BinaryTreeNode.data)

n1 = BinaryTreeNode(data="D")
n2 = BinaryTreeNode(data="E")
n3 = BinaryTreeNode(data="F")
n4 = BinaryTreeNode(data="B", left=n1, right=n2)
n5 = BinaryTreeNode(data="C", left=n3, right=None)
root = BinaryTreeNode(data="A", left=n4, right=n5)

bt = BinaryTree(root)
print('先序遍歷')
bt.preOrder(bt.root)
print('中序遍歷')
bt.inOrder(bt.root)
print('後序遍歷')
bt.postOrder(bt.root)

程序運行結果:spa

先序遍歷
A
B
D
E
C
F
中序遍歷
D
B
E
A
F
C
後序遍歷
D
E
B
F
C
A
[Finished in 0.1s]
相關文章
相關標籤/搜索