Python中的递归完整二叉树 - 树是倾斜的

时间:2017-01-31 05:49:58

标签: python algorithm data-structures binary-tree

这是一个完整二叉树的递归实现(不是Python中的二进制搜索树。需要帮助构建平衡树的逻辑,我编写的逻辑会生成一个偏斜的树。我知道它可以使用队列来完成,但我需要一个递归实现。

以下是代码:

class Node:
    """A simple Binary Node to be used in a Tree"""

    def __init__(self, value=-1, leftNode=None, rightNode=None):
        self.value = value
        self.leftNode = leftNode
        self.rightNode = rightNode

class BinaryTree:
def __init__(self, root=None):
    self.root = root
    self.noOfLeftNodes = 0
    self.noOfRightNodes = 0

def addNode(self, root, node):
    if self.root is None:
        self.root = node
        return
    if root.leftNode is None:
        root.leftNode = node
        self.noOfLeftNodes += 1
        return
    elif root.rightNode is None:
        root.rightNode = node
        self.noOfRightNodes += 1
        return

    else:
        if self.noOfLeftNodes - self.noOfRightNodes < 2:
            self.addNode(root.leftNode, node)
        else:
            self.addNode(root.rightNode, node)

def preorder(self, root):
    if root is None:
        return
    print(root.value)
    self.preorder(root.leftNode)
    self.preorder(root.rightNode)

#Test stub 
    bt = BinaryTree()
    nodes = [1, 2, 3, 4, 5, 6, 7]
    for i in range(len(nodes)):
        bt.addNode(bt.root, Node(nodes[i]))
    print('---Binary Tee---')
    bt.preorder(bt.root)

1 个答案:

答案 0 :(得分:0)

考虑一下算法运行时会发生什么:

  • 1成为根。 (#left = 0,#right = 0)。
  • 2成为根的左子(#left = 1,#right = 0)。
  • 3成为根的正确子项(#left = 1,#right = 1)。
  • 4触发else,因为#left - #right = 0&lt; 2,插入......
  • ...(这样做,直到你达到算法不符合预期的程度。)

提示: #left和#right 正在做他们应该做的事情。如果在根的右子树中插入左子项,则#left会递增。尝试为每个节点维护这些值,而不仅仅是整个树的一次。