Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 使用Python向二叉树中缺少的节点添加值_Python 2.7_Binary Tree - Fatal编程技术网

Python 2.7 使用Python向二叉树中缺少的节点添加值

Python 2.7 使用Python向二叉树中缺少的节点添加值,python-2.7,binary-tree,Python 2.7,Binary Tree,我有以下二叉树: ..............1 ............/....\ ...........2......3 ........../..\......\ .........4....5.....6 ..........\........./ ...........8.......7 我希望通过向缺少的节点添加(-1)并逐行获取,从而将其完成为一个完整的二叉树。 这意味着树将如下所示: ..............1 ............/.....\ ..........

我有以下二叉树:

..............1
............/....\
...........2......3
........../..\......\
.........4....5.....6
..........\........./
...........8.......7
我希望通过向缺少的节点添加(-1)并逐行获取,从而将其完成为一个完整的二叉树。 这意味着树将如下所示:

..............1
............/.....\
...........2.........3
........../..\....../..\
.........4....5....-1.....6
......../.\.../\..../.\../.\
......-1...8.-1.-1.-1.-1.7.-1
所需结果如下:

1
2 3
4 5 -1 6
-1 8 -1 -1 -1 -1 7 -1
创建二叉树的代码是:

class Node:
    def __init__(self,val):
        self.val = val
        self.left = None
        self.right = None



root =  Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.left.left = Node(7)
root.left.left.right = Node(8)

唯一的问题是您必须首先确定
级别
,然后通过它。但是,这也是可以处理的。 填充缺少的节点:

def fillMissingNodes(root, level):
    if (root == None):
        return
    if(root.left == None and level > 0):
        root.left = Node(-1)
    if(root.right == None and level > 0):
        root.right = Node(-1)
    fillMissingNodes(root.left, level - 1)
    fillMissingNodes(root.right, level - 1)

fillMissingNodes(root, 3)
现在,您可以以任何方式进行遍历。下面是使用队列的级别顺序遍历:

def traverseLevelOrder(q):
    while(q.qsize() > 1):
        current = q.get()
        if(current == None):
            q.put(None)
            print("\n")
        else:
            if(current.left != None):
                q.put(current.left)
            if(current.right != None):
                q.put(current.right)
            print(current.val),

traverseLevelOrder(q)
如果要将填充缺失节点和遍历线顺序结合起来,请执行以下操作:

def traverseLevelOrderAndFillMissingNodes(q, level):
    while(q.qsize() > 1):
        current = q.get()
        if(current == None):
            q.put(None)
            print("\n")
            level = level - 1
        else:
            if(current.left == None and level > 0):
                current.left = Node(-1)
            if(current.right == None and level > 0):
                current.right = Node(-1)
            if(current.left != None):
                q.put(current.left)
            if(current.right != None):
                q.put(current.right)
            print(current.val),


traverseLevelOrderAndFillMissingNodes(q, 3)
以下是输出:

1 
2 3 
4 5 -1 6 
-1 8 -1 -1 -1 -1 7 -1
请参阅完整的运行示例

顺便说一句,树创建代码与图中所示的不完全相同。左侧和右侧有一个小问题(查看添加的6和7)。这是正确的一个:

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
root.right.right.left = Node(7)
root.left.left.right = Node(8)

唯一的问题是您必须首先确定
级别
,然后通过它。但是,这也是可以处理的。 填充缺少的节点:

def fillMissingNodes(root, level):
    if (root == None):
        return
    if(root.left == None and level > 0):
        root.left = Node(-1)
    if(root.right == None and level > 0):
        root.right = Node(-1)
    fillMissingNodes(root.left, level - 1)
    fillMissingNodes(root.right, level - 1)

fillMissingNodes(root, 3)
现在,您可以以任何方式进行遍历。下面是使用队列的级别顺序遍历:

def traverseLevelOrder(q):
    while(q.qsize() > 1):
        current = q.get()
        if(current == None):
            q.put(None)
            print("\n")
        else:
            if(current.left != None):
                q.put(current.left)
            if(current.right != None):
                q.put(current.right)
            print(current.val),

traverseLevelOrder(q)
如果要将填充缺失节点和遍历线顺序结合起来,请执行以下操作:

def traverseLevelOrderAndFillMissingNodes(q, level):
    while(q.qsize() > 1):
        current = q.get()
        if(current == None):
            q.put(None)
            print("\n")
            level = level - 1
        else:
            if(current.left == None and level > 0):
                current.left = Node(-1)
            if(current.right == None and level > 0):
                current.right = Node(-1)
            if(current.left != None):
                q.put(current.left)
            if(current.right != None):
                q.put(current.right)
            print(current.val),


traverseLevelOrderAndFillMissingNodes(q, 3)
以下是输出:

1 
2 3 
4 5 -1 6 
-1 8 -1 -1 -1 -1 7 -1
请参阅完整的运行示例

顺便说一句,树创建代码与图中所示的不完全相同。左侧和右侧有一个小问题(查看添加的6和7)。这是正确的一个:

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
root.right.right.left = Node(7)
root.left.left.right = Node(8)

递归迭代树,检查left是否为null,当前节点值是否为-1,在左侧创建并添加一个节点。对右侧执行相同操作。请参考答案中的注释,您可以轻松修复输出中的新行问题。递归迭代树,检查左侧是否为null,当前节点值是否为-1,在左侧创建并添加一个节点。请参考答案中的注释,您可以很容易地解决输出中的新行问题。是否有一种方法可以创建一个不需要将级别作为参数发送(仅为q)的函数?是否有一种方法可以创建一个不需要将级别作为参数发送(仅为q)的函数?