python 重建二叉树的三个方法

来源:互联网 发布:手机收发邮件软件 编辑:程序博客网 时间:2024/05/21 03:18

python 重建二叉树的三个方法

学习算法中,探寻重建二叉树的方法:

  • 用input 前序遍历顺序输入字符重建
  • 前序遍历顺序字符串递归解析重建
  • 前序遍历顺序字符串堆栈解析重建

如果懒得去看后面的内容,可以直接下载代码:
python 四种方法解析重建二叉树,七种方法遍历二叉树

思路

学习算法中,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