如何使用python将二叉树表示为数组?

时间:2019-07-03 05:39:19

标签: python-3.x binary-tree

我想使用Python将二叉树转换为数组,并且我不知道如何给树节点提供索引?

我已经使用公式完成了 left_son =(2 * p)+1; 和right_son =(2 * p)+2;在Java中,但我陷在python中。有什么功能可以给python中的树节点索引吗?

2 个答案:

答案 0 :(得分:0)

如果是二叉树,则必须执行级别顺序遍历。而且,当您继续遍历时,必须将值按遍历期间出现的顺序存储在数组中。这将帮助您恢复二叉树的属性,并保持元素的顺序。这是执行级别顺序遍历的代码。

class Node: 

    # A utility function to create a new node 
    def __init__(self, key): 
        self.data = key  
        self.left = None
        self.right = None


# Function to  print level order traversal of tree 
def printLevelOrder(root): 
    h = height(root) 
    for i in range(1, h+1): 
        printGivenLevel(root, i) 


# Print nodes at a given level 
def printGivenLevel(root , level): 
    if root is None: 
        return
    if level == 1: 
        print "%d" %(root.data), 
    elif level > 1 : 
        printGivenLevel(root.left , level-1) 
        printGivenLevel(root.right , level-1) 


""" Compute the height of a tree--the number of nodes 
    along the longest path from the root node down to 
    the farthest leaf node 
"""
def height(node): 
    if node is None: 
        return 0 
    else : 
        # Compute the height of each subtree  
        lheight = height(node.left) 
        rheight = height(node.right) 

        #Use the larger one 
        if lheight > rheight : 
            return lheight+1
        else: 
            return rheight+1

# Driver program to test above function 
root = Node(1) 
root.left = Node(2) 
root.right = Node(3) 
root.left.left = Node(4) 
root.left.right = Node(5) 

print "Level order traversal of binary tree is -"
printLevelOrder(root)

答案 1 :(得分:0)

您可以以完全相同的方式在python中将一棵二叉树表示为一维列表。

例如,如果您在树上的表示为:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

0是根
12是下一个级别
12的子代分别是[3, 4][5, 6]

这与您的公式相对应。对于索引为i的给定节点,该节点的子节点为(2*i)+1 (2*i)+2。这是建模堆的常用方法。您可以在[heapq库]中了解有关Python如何使用它的更多信息。(https://docs.python.org/3.0/library/heapq.html

您可以使用此工具通过以下方式深入遍历树:

a =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]

def childNodes(i):
     return (2*i)+1, (2*i)+2

def traversed(a, i=0, d = 0):
    if i >= len(a):
        return 
    l, r =  childNodes(i)
    traversed(a, r, d = d+1)
    print("   "*d + str(a[i]))
    traversed(a, l, d = d+1)

traversed(a)

此照片

         15
      6
         14
   2
         13
      5
         11
0
         10
      4
         9
   1
         8
      3
         7