繁体   English   中英

Python 二叉树使用构建而不是节点

[英]Python binary tree use build instead of Node

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
def printPaths(root): 
    path = []
    printPathsRec(root, path, 0)
def printPathsRec(root, path, pathLen):  
    if root is None:
        return
    if(len(path) > pathLen):
        path[pathLen] = root.data
    else:
        path.append(root.data)
    pathLen = pathLen + 1
    if root.left is None and root.right is None:
        printArray(path, pathLen)
    else:
    
        printPathsRec(root.left, path, pathLen)
        printPathsRec(root.right, path, pathLen)

def printArray(ints, len):
    for i in ints[0 : len]:
        print(i," ",end="")
    print()
 

from binarytree import build

values = [7, 3, 2, 6, 9, None, 1, 5, 8]
root = build(values)
print(root) 
printPaths(root.value)
.

我需要用 build 构建二叉树并使代码工作,但我找不到方法。 这个例子是从网上得到的,他们使用的方法像

root = Node(10)
root.left = Node(8)
root.right = Node(2)
root.left.left = Node(3)
root.left.right = Node(5)
root.right.left = Node(2)
printPaths(root)

但我需要使用另一种方法来实现它。

我将猜测values包含树的级别顺序值,其中不包括None以下的子项(而不是具有两个填充None值)。

然后填充新树的算法将遵循填充的级别顺序方式。 为此,您通常使用队列或双端队列或两个列表。 例如:

def build(values):
    if not values:
        return
    it = iter(values)
    root = Node(next(it))
    level = [root]
    while level:
        nextlevel = []
        for parent in level:
            value = next(it, None)
            if value is not None:
                parent.left = Node(value)
                nextlevel.append(parent.left)
            value = next(it, None)
            if value is not None:
                parent.right = Node(value)
                nextlevel.append(parent.right)
        level = nextlevel
    return root

创建二叉树:

你需要一个顺序的列表。

class Node:
    count = 0
    def __init__(self, val):
        self.left = None
        self.right = None
        self.val = val
        Node.count+= 1
        
    def __str__(self):
        return (f"value is {self.val} \ncount is:{self.count}")
        

如果信息如下:

from collections import deque

d = {0:[1,2], 2:[4,5], 1:[3]} # how nodes are connected. key is node number and values is node num of children.

vals = [10,11,12,13,14,15] # values associated with the node num

q = deque()
q.append(0) #<---- root node
li = [vals[0]] #<--- root node val
while(len(q)>0):
    front = q.popleft()
    
    if (d.get(front, 0)):
        if(len(d[front])==2):
            li.append(vals[d[front][0]])
            li.append(vals[d[front][1]])
            q.append(d[front][0])
            q.append(d[front][1])
        else:
            li.append(vals[d[front][0]])
            li.append(None)
            q.append(d[front][0])
#         q.append(d[front][1])
    else:
        li.append(None)
        li.append(None)

这会给你列表

李:

[10, 11, 12, 13, None, 14, 15, None, None, None, None, None, None]

建造:

def build(values):
    if not values:
        return None
    it = iter(values)
    root=Node(next(it))
    q = deque()
    q.append(root)
    while(q):
        front = q.popleft()
        val1 = next(it, None)
        if (val1):
            n1 = Node(val1)
            q.append(n1)
            front.left = n1
            
        val2 = next(it, None)
        if (val2):
            n2 = Node(val2)
            q.append(n2)
            front.right = n2
    return root
    
node = build(li)

要按顺序打印:

def print_node(root):
    if not root:
        return
    print_node(root.left)
    print(root.val, end=" ")
    print_node(root.right)
   

print_node(node)

13 11 10 14 12 15

直截了当:

from collections import deque

d = {0:[1,2], 2:[4,5], 1:[3]}
vals = [10,11,12,13,14,15]


q = deque()
root = Node(vals[0], 0)
q.append(root)
while(q):
    node = q.popleft()
    if (d.get(node.node_num, {})):
        if(len(d[node.node_num])==2):
            no1 = d[node.node_num][0]
            node.left = Node(vals[no1],no1)
            no2 = d[node.node_num][1]
            node.right = Node(vals[no2], no2)
            q.append(node.left)
            q.append(node.right)
        else:
            no1 = d[node.node_num][0]
            node.left = Node(vals[no1],no1)
            q.append(node.left)

print_node(root)

13 11 10 14 12 15

暂无
暂无

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

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