python數據結構之樹和二叉樹(先序遍歷、中序遍歷和后序遍歷)
樹
樹是\(n\)(\(n\ge 0\))個結點的有限集。在任意一棵非空樹中,有且只有一個根結點。
二叉樹是有限個元素的集合,該集合或者為空、或者有一個稱為根節點(root)的元素及兩個互不相交的、分別被稱為左子樹和右子樹的二叉樹組成。
- 二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。
- 二叉樹的第i層至多有2^{i-1}個結點
- 深度為k的二叉樹至多有2^k-1個結點;
- 對任何一棵二叉樹T,如果其終端結點數為N0,度為2的結點數為N2,則N0=N2+1
例子
實現以下二叉樹,並進行先序遍歷、中序遍歷和后序遍歷。
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)
程序運行結果:
先序遍歷
A
B
D
E
C
F
中序遍歷
D
B
E
A
F
C
后序遍歷
D
E
B
F
C
A
[Finished in 0.1s]