本文实例讲述了Python实现重建二叉树的三种方法。分享给大家供大家参考,具体如下:
学习算法中,探寻重建二叉树的方法:
- 用input 前序遍历顺序输入字符重建
- 前序遍历顺序字符串递归解析重建
- 前序遍历顺序字符串堆栈解析重建
如果懒得去看后面的内容,可以直接点击此处本站下载完整实例代码。
思路
学习算法中,python 算法方面的资料相对较少,二叉树解析重建更少,只能摸着石头过河。
通过不同方式遍历二叉树,可以得出不同节点的排序。那么,在已知节点排序的前提下,通过某种遍历方式,可以将排序进行解析,从而构建二叉树。
应用上来将,可以用来解析多项式、可以解析网页、xml等。
本文采用前序遍历方式的排列,对已知字符串进行解析,并生成二叉树。新手,以解题为目的,暂未优化,未能体现 Python 简洁、优美。请大牛不吝指正。
首先采用 input 输入
节点类
class treeNode: def __init__(self, rootObj = None, leftChild = None, rightChild = None): self.key = rootObj self.leftChild = None self.rightChild = None
input 方法重建二叉树
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 为实例化一个空树
调用递归方法重建二叉树
treeElementList = '124#8##5##369###7##' myTree = myTree.createTreeByListWithRecursion(list(treeElementList)) printBTree(myTree, 0)
递归方法重建二叉树
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
调用堆栈方法重建二叉树
treeElementList = '124#8##5##369###7##' myTree = myTree.createTreeByListWithStack(list(treeElementList)) printBTree(myTree, 0)
使用堆栈重建二叉树
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
显示二叉树
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相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]