本文实例讲述了Python实现重建二叉树的三种方法。分享给大家供大家参考,具体如下:
学习算法中,探寻重建二叉树的方法:
- 用input 前序遍历顺序输入字符重建
- 前序遍历顺序字符串递归解析重建
- 前序遍历顺序字符串堆栈解析重建
如果懒得去看后面的内容,可以直接点击此处本站下载完整实例代码。
思路
学习算法中,python 算法方面的资料相对较少,二叉树解析重建更少,只能摸着石头过河。
通过不同方式遍历二叉树,可以得出不同节点的排序。那么,在已知节点排序的前提下,通过某种遍历方式,可以将排序进行解析,从而构建二叉树。
应用上来将,可以用来解析多项式、可以解析网页、xml等。
本文采用前序遍历方式的排列,对已知字符串进行解析,并生成二叉树。新手,以解题为目的,暂未优化,未能体现 Python 简洁、优美。请大牛不吝指正。
首先采用 input 输入
节点类
1
2
3
4
5
|
class treeNode:
def __init__( self , rootObj = None , leftChild = None , rightChild = None ):
self .key = rootObj
self .leftChild = None
self .rightChild = None
|
input 方法重建二叉树
1
2
3
4
5
6
7
8
9
|
def createTreeByInput( self , root):
tmpKey = raw_input ( "please input a key, input '#' for Null" )
if tmpKey = = '#' :
root = None
else :
root = treeNode(rootObj = tmpKey)
root.leftChild = self .createTreeByInput(root.leftChild)
root.rightChild = self .createTreeByInput(root.rightChild)
return root
|
以下两种方法,使用预先编好的字符串,通过 list 方法转换为 list 传入进行解析
myTree 为实例化一个空树
调用递归方法重建二叉树
1
2
3
|
treeElementList = '124#8##5##369###7##'
myTree = myTree.createTreeByListWithRecursion( list (treeElementList))
printBTree(myTree, 0 )
|
递归方法重建二叉树
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def createTreeByListWithRecursion( self , preOrderList):
"""
根据前序列表重建二叉树
:param preOrder: 输入前序列表
:return: 二叉树
"""
preOrder = preOrderList
if preOrder is None or len (preOrder) < = 0 :
return None
currentItem = preOrder.pop( 0 ) # 模拟C语言指针移动
if currentItem is '#' :
root = None
else :
root = treeNode(currentItem)
root.leftChild = self .createTreeByListWithRecursion(preOrder)
root.rightChild = self .createTreeByListWithRecursion(preOrder)
return root
|
调用堆栈方法重建二叉树
1
2
3
|
treeElementList = '124#8##5##369###7##'
myTree = myTree.createTreeByListWithStack( list (treeElementList))
printBTree(myTree, 0 )
|
使用堆栈重建二叉树
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
def createTreeByListWithStack( self , preOrderList):
"""
根据前序列表重建二叉树
:param preOrder: 输入前序列表
:return: 二叉树
"""
preOrder = preOrderList
pStack = SStack()
# check
if preOrder is None or len (preOrder) < = 0 or preOrder[ 0 ] is '#' :
return None
# get the root
tmpItem = preOrder.pop( 0 )
root = treeNode(tmpItem)
# push root
pStack.push(root)
currentRoot = root
while preOrder:
# get another item
tmpItem = preOrder.pop( 0 )
# has child
if tmpItem is not '#' :
# does not has left child, insert one
if currentRoot.leftChild is None :
currentRoot = self .insertLeft(currentRoot, tmpItem)
pStack.push(currentRoot.leftChild)
currentRoot = currentRoot.leftChild
# otherwise insert right child
elif currentRoot.rightChild is None :
currentRoot = self .insertRight(currentRoot, tmpItem)
pStack.push(currentRoot.rightChild)
currentRoot = currentRoot.rightChild
# one child is null
else :
# if has no left child
if currentRoot.leftChild is None :
currentRoot.leftChild = None
# get another item fill right child
tmpItem = preOrder.pop( 0 )
# has right child
if tmpItem is not '#' :
currentRoot = self .insertRight(currentRoot, tmpItem)
pStack.push(currentRoot.rightChild)
currentRoot = currentRoot.rightChild
# right child is null
else :
currentRoot.rightChild = None
# pop itself
parent = pStack.pop()
# pos parent
if not pStack.is_empty():
parent = pStack.pop()
# parent become current root
currentRoot = parent
# return from right child, so the parent has right child, go to parent's parent
if currentRoot.rightChild is not None :
if not pStack.is_empty():
parent = pStack.pop()
currentRoot = parent
# there is a leftchild ,fill right child with null and return to parent
else :
currentRoot.rightChild = None
# pop itself
parent = pStack.pop()
if not pStack.is_empty():
parent = pStack.pop()
currentRoot = parent
return root
|
显示二叉树
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def printBTree(bt, depth):
'''''
递归打印这棵二叉树,#号表示该节点为NULL
'''
ch = bt.key if bt else '#'
if depth > 0 :
print '%s%s%s' % ((depth - 1 ) * ' ' , '--' , ch)
else :
print ch
if not bt:
return
printBTree(bt.leftChild, depth + 1 )
printBTree(bt.rightChild, depth + 1 )
|
打印二叉树的代码,采用某仁兄代码,在此感谢。
input 输入及显示二叉树结果
解析字符串的结果
完整代码参见:https://github.com/flyhawksz/study-algorithms/blob/master/Class_BinaryTree2.py
希望本文所述对大家Python程序设计有所帮助。
原文链接:https://blog.csdn.net/fly_hawk/article/details/78388791