在Python中创建一个空的二叉树

时间:2017-03-05 13:43:27

标签: python-3.x binary-tree

我是编程的初学者,我在其他问题中找不到答案。 我想创建一个高度为h的空二进制树。

我的代码:

class node:
    def __init__(self, a = None):
        self.value = a
        self.left = None
        self.right = None

def postorder(tree,abba):
    if tree != None:
        postorder(tree.left,abba)
        postorder(tree.right,abba)
        abba.append(tree.value)

def inorder(tree,abba):
  if tree != None:
      inorder(tree.left,abba)
      abba.append(tree.value)
      inorder(tree.right,abba)

我想定义一个函数

def getBinaryTree(h):

这给了我一棵水平为h的树。所以: empty tree of level

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

<强>更新

要制作高度为h的二叉树,您需要添加2^(h+1)-1个节点。高度为0的树意味着,树只包含一个节点,即根节点。例如,要创建高度为3的树,您需要添加2^(3+1)-1 = 15个节点。

如果要创建一组可以使用给定代码形成二叉树的节点,可以执行以下操作。

import math

class node:
    def __init__(self, a = None):
        self.value = a
        self.left = None
        self.right = None

def getBinaryTree(tree_height):
    tree_nodes = [None] * int((math.pow(2, tree_height+1) - 1))
    for i in range(tree_height):
        start_index = int(math.pow(2, i) - 1)
        end_index = int(math.pow(2, i+1) - 1)
        for j in range(start_index, end_index):
            tree_nodes[j] = node(j)
            if j == 0: continue
            if j % 2 == 0: # a right child
                parent_index = int((j - 2) / 2)
                tree_nodes[parent_index].right = tree_nodes[j]
            else: # a left child
                parent_index = int((j - 1) / 2)
                tree_nodes[parent_index].left = tree_nodes[j]

    return tree_nodes[0] # returns the root node

def printTree(tree_node, inorder_tree_walk):
    if tree_node != None:
        printTree(tree_node.left, print_tree)
        inorder_tree_walk.append(tree_node.value)
        printTree(tree_node.right, print_tree)

root = getBinaryTree(4)
inorder_tree_walk = []
printTree(root, inorder_tree_walk)
print(inorder_tree_walk)
  

那么,该计划的作用是什么?

程序创建2^(h+1)-1个节点以形成高度为h的树。节点存储在列表tree_nodes中。节点之间的父子关系存储在tree_nodes中,如下所示。

  • 元素i的左子元素:(2i + 1)元素
  • 元素i的右子:(2i + 2)元素

创建子节点时,将其设置为其父节点的左/右子节点。