繁体   English   中英

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

[英]Recursive Complete Binary Tree in Python - The tree is skewed

这是完整二叉树的递归实现(不是列表中的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成为根。 (#left = 0,#right = 0)。
  • 2成为根的左子节点(#left = 1,#right = 0)。
  • 3成为根的右子代(#left = 1,#right = 1)。
  • 4触发else并因为#left-#right = 0 <2,所以将其插入...
  • ...(这样做,直到达到算法所不期望的程度。)

提示: #left和#right 并未执行应有的操作。 如果您在根的右子树中插入一些东西作为左孩子,则#left会增加。 尝试为每个节点维护这些值,而不是为整个树维护一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM