在好例子网,分享、交流、成长!
您当前所在位置:首页Python 开发实例常用Python方法 → Binary Tree Algorithm (in Python)

Binary Tree Algorithm (in Python)

常用Python方法

下载此实例
  • 开发语言:Python
  • 实例大小:8.44KB
  • 下载次数:5
  • 浏览次数:96
  • 发布时间:2021-01-12
  • 实例类别:常用Python方法
  • 发 布 人:Edennnnnn
  • 文件格式:.py
  • 所需积分:3

实例介绍

【实例简介】

**Binary Tree Algorithm (in Python)**

简易二叉树算法,包含可视化打印,附三类顺序表达和额外查找方法。

最后一部分代码用以根据两种 data orders (inorder & preorder) 识别并创建Binary tree object.
【实例截图】

from clipboard

【核心代码】
```python

class BinaryTree:
    def __init__(self, rootElement):
        self.key = rootElement
        self.left = None
        self.right = None

    def getLeft(self):
        return self.left

    def getRight(self):
        return self.right

    def getKey(self):
        return self.key

    def setKey(self, key):
        self.key = key

    def setLeft(self, left):
        self.left = left

    def setRight(self, right):
        self.right = right

    def insertLeft(self, newNode):
        if self.left == None:
            self.left = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.left = self.left
            self.left = t

    def insertRight(self, newNode):
        if self.right == None:
            self.right = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.right = self.right
            self.right = t

    def _strHelper(self):
        """Returns list of strings, total width of the tree, position of the middle node and the height"""
        if self.getLeft() == None and self.getRight() == None:
            row = '%s' % self.key
            width = len(row)
            middle = width // 2
            height = 1
            return [row], width, middle, height

        keyStr = '%s' % self.key
        keyStrLength = len(keyStr)
        if self.getLeft() != None and self.getRight() == None:
            leftRows, leftWidth, leftMiddle, leftHeight = self.getLeft()._strHelper()
            firstRow = (leftMiddle 1) * ' ' (leftWidth - leftMiddle - 1) * '_' keyStr
            secondRow = leftMiddle * ' ' '/' (leftWidth - leftMiddle - 1 keyStrLength) * ' '
            shiftedRows = [row keyStrLength * ' ' for row in leftRows]
            return [firstRow, secondRow] shiftedRows, leftWidth keyStrLength, leftWidth keyStrLength // 2, leftHeight 2

        elif self.getLeft() == None and self.getRight() != None:
            rightRows, rightWidth, rightMiddle, rightHeight = self.getRight()._strHelper()
            firstRow = keyStr rightMiddle * '_' (rightWidth - rightMiddle) * ' '
            secondRow = (keyStrLength rightMiddle) * ' ' '\\' (rightWidth - rightMiddle - 1) * ' '
            shiftedRows = [keyStrLength * ' ' row for row in rightRows]
            return [firstRow, secondRow] shiftedRows, rightWidth keyStrLength,keyStrLength // 2, rightHeight 2,

        else:
            leftRows, leftWidth, leftMiddle, leftHeight = self.getLeft()._strHelper()
            rightRows, rightWidth, rightMiddle, rightHeight = self.getRight()._strHelper()

            firstRow = (leftMiddle 1) * ' ' (leftWidth - leftMiddle - 1) * '_' keyStr rightMiddle * '_' (rightWidth - rightMiddle) * ' '
            secondRow = leftMiddle * ' ' '/' (leftWidth - leftMiddle - 1 keyStrLength rightMiddle) * ' ' '\\' (rightWidth - rightMiddle - 1) * ' '
            # append a few rows to fill in the blanks in the bottom, so that left and right lists are of the length
            if leftHeight < rightHeight:
                leftRows = [leftWidth * ' '] * (rightHeight - leftHeight)
            else:
                rightRows = [rightWidth * ' '] * (leftHeight - rightHeight)
            pairedRows = zip(leftRows, rightRows)
            rows = [firstRow, secondRow] [i keyStrLength * ' ' j for i, j in pairedRows]
            return rows, leftWidth rightWidth keyStrLength,  leftWidth keyStrLength // 2, max(leftHeight, rightHeight) 2

    def __str__(self):
        rows, _, _, _ = self._strHelper()
        result = ''
        for row in rows:
            result = row "\n"
        return result

# Data Orders:
def preorder(tree):
    """
    print the value of a tree in a Preorder manner
    Parameters:
        - tree (a BinaryTree object)

    Returns: None
    """
    if tree is not None:
        print(tree.getKey())
        preorder(tree.getLeft())
        preorder(tree.getRight())


def inorder(tree):
    """
    print the value of a tree in an Inorder manner
    Parameters:
        - tree (a BinaryTree object)

    Returns: None
    """
    if tree is not None:
        inorder(tree.getLeft())
        print(tree.getKey())
        inorder(tree.getRight())


def postorder(tree):
    """
    print the value of a tree in a postorder manner
    Parameters:
        - tree (a BinaryTree object)

    Returns: None
    """
    if tree is not None:
        postorder(tree.getLeft())
        postorder(tree.getRight())
        print(tree.getKey())



# Extra Operations:
def findMinKey(tree):
    """
    find the minimum element in the tree
    Parameters:
        - tree (a BinaryTree object)

    Returns: None if tree is None, otherwise a number
    """
    if tree is not None:
        value_key = tree.getKey()
        Min = value_key
        if tree.getLeft() is not None:
            value_Left = findMinKey(tree.getLeft())
            if value_Left < Min:
                Min = value_Left
        if tree.getRight() is not None:
            value_right = findMinKey(tree.getRight())
            if value_right < Min:
                Min = value_right
        return Min


def findMaxKey(tree):
    """
    find the maximum element in the tree
    Parameters:
        - tree (a BinaryTree object)

    Returns: None if tree is None, otherwise a number
    """
    if tree is not None:
        value_key = tree.getKey()
        Max = value_key
        if tree.getLeft() is not None:
            value_Left = findMaxKey(tree.getLeft())
            if value_Left > Max:
                Max = value_Left
        if tree.getRight() is not None:
            value_right = findMaxKey(tree.getRight())
            if value_right > Max:
                Max = value_right
        return Max


# Building Trees based on inorder and preorder sequences:
def buildTree(inOrder, preOrder):
    """
    Build a binary tree based on given Inorder and PreOrder traversals

    Parameters:
        - inOrder,preOrder (list of numbers)

    Returns: a BinaryTree object
    """
    if len(preOrder) > 0:
        rootValue = preOrder[0]
        tree = BinaryTree(rootValue)

        index = inOrder.index(rootValue)
        inOrder_left = inOrder[:index]
        inOrder_right = inOrder[index 1:]

        partialLength = len(inOrder_left)
        preOrder_left = preOrder[1:partialLength 1]
        preOrder_right = preOrder[partialLength 1:]

        tree.left = buildTree(inOrder_left, preOrder_left)
        tree.right = buildTree(inOrder_right, preOrder_right)

        return tree
    else:
        return None
```



实例下载地址

Binary Tree Algorithm (in Python)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警