当前位置: 首页 > 知识库问答 >
问题:

二叉树添加左侧和添加右侧节点不添加

计寒
2023-03-14

我正在将以下数据作为赋值的一部分读取到二叉树(不是严格的二叉查找树)中:

5
4 1 2
2 3 4
5 -1 -1
1 -1 -1
3 -1 -1

它们被读取到pythonself.keyself.leftself.right中的三个列表中,其中第一行具有整数n是节点数。接下来的n行是键,左,右。其中左是父级左子级的键是key[左],同样右子级的键是key[右],因此例如第一行是4的键是根,key[1]意味着2是4的左子级,key[2]意味着5是4的右子级,以此类推,-1代表左右意味着这个键是叶子:

此示例的树结构

问题是正在添加根的左右子节点,但没有添加其中的任何子节点。我是否正确地将节点添加到树中?我不能仅根据键的值添加它们,因为它不是严格的二叉查找树,正如其他一些示例所表明的那样,例如root=0和左子节点=70和右子节点=20。inorder遍历的输出是2 4 5(应该是1 2 3 4 5),这让我相信我没有添加更多的节点。任何关于添加方法的帮助都将不胜感激...

import sys, threading
sys.setrecursionlimit(10**6) # max depth of recursion
threading.stack_size(2**27)  # new thread will get stack of such size


class Node:
    def __init__(self, val):
        self.l = None
        self.r = None
        self.v = val

class Tree:
    def __init__(self):
        self.root = None

    def getRoot(self):
        return self.root

    def add_root(self, val):
        if(self.root is None):
            self.root = Node(val)

    def add_left(self, val, node):
        if(node.l is None):
            node.l = Node(val)

    def add_right(self, val, node):
        if(node.r is None):
            node.r = Node(val)

    def deleteTree(self):
        # garbage collector will do this for us. 
        self.root = None


    def inOrder(self):
        self.result = []
        if(self.root is not None):
            self._inOrder(self.root, self.result)
            return self.result
        else:
            print('root is None')

    def _inOrder(self, node, result):
        if(node != None):
            self._inOrder(node.l, self.result)
            self.result.append(node.v)
            self._inOrder(node.r, self.result)

    def read(self):
        self.n = int(sys.stdin.readline())
        self.key = [0 for i in range(self.n)]
        self.left = [0 for i in range(self.n)]
        self.right = [0 for i in range(self.n)]
        for i in range(self.n):
            [a, b, c] = map(int, sys.stdin.readline().split())
            self.key[i] = a
            self.left[i] = b
            self.right[i] = c

        #adding root
        self.add_root(self.key[0])
        if self.left[0] != -1: 
            #add left of root
            self.add_left(self.key[self.left[0]], self.root)
        if self.right[0] != -1:
            #add right of root
            self.add_right(self.key[self.right[0]], self.root)

        #where it is not adding left and right nodes
        for i in range(1, self.n):
            if self.left[i] != -1:
                # adding the other left nodes
                self.add_left(self.key[self.left[i]], Node(self.key[i]))
            if self.right[i] != -1:
                # adding the other right nodes
                self.add_right(self.key[self.right[i]], Node(self.key[i]))

def main():
    tree = Tree()
    tree.read()
    print(" ".join(str(x) for x in tree.inOrder()))
    #print(" ".join(str(x) for x in tree.preOrder()))
    #print(" ".join(str(x) for x in tree.postOrder()))

threading.Thread(target=main).start()

共有1个答案

贺季
2023-03-14

谢谢我让它工作了——我把节点Node(键[I])添加到字典和self中。nodes[val]=[node,node.l,node.r]当添加左键时,递归地在字典中搜索索引、前序和后序树遍历。

 class Node:
    def __init__(self, val):
        self.l = None
        self.r = None
        self.v = val

class Tree:

    def __init__(self):
        self.root = None
        self.nodes = {}

    def getRoot(self):
        return self.root

    def add_root(self, val):
        if(self.root is None):
            self.root = Node(val)
            self.nodes[val] = [self.root,-1,-1]

    def add_left(self, val, node):
        if(node.l is None):
            node.l = Node(val)
            self.nodes[node.v][1] = node.l

    def add_right(self, val, node):
        if(node.r is None):
            node.r = Node(val)
            self.nodes[node.v][2] = node.r

    def inOrder(self):
        self.result = []
        if(self.root is not None):
            self._inOrder(self.root, self.result)
            return self.result
        else:
            print('root is None')

    def _inOrder(self, node, result):
        if(node is not None):
            try:
                self._inOrder(self.nodes[node.v][1], self.result)
            except (IndexError, AttributeError):
                pass
            self.result.append(node.v)
            try:
                self._inOrder(self.nodes[node.v][2], self.result)
            except (IndexError, AttributeError):
                pass
    def preOrder(self):
        self.result = []
        if(self.root is not None):
            self._preOrder(self.root, self.result)
            return self.result
        else:
            print('root is None')

    def _preOrder(self, node, result):
        if(node is not None):
            self.result.append(node.v)
            try:
                self._preOrder(self.nodes[node.v][1], self.result)
            except (IndexError, AttributeError):
                pass
            try:
                self._preOrder(self.nodes[node.v][2], self.result)
            except (IndexError, AttributeError):
                pass

    def postOrder(self):
        self.result = []
        if(self.root is not None):
            self._postOrder(self.root, self.result)
            return self.result
        else:
            print('root is None')

    def _postOrder(self, node, result):
        if(node is not None):
            try:
                self._postOrder(self.nodes[node.v][1], self.result)
            except (IndexError, AttributeError):
                pass
            try:
                self._postOrder(self.nodes[node.v][2], self.result)
            except (IndexError, AttributeError):
                pass
            self.result.append(node.v)

    def read(self):
        self.n = int(sys.stdin.readline())
        self.key = [0 for i in range(self.n)]
        self.left = [0 for i in range(self.n)]
        self.right = [0 for i in range(self.n)]
        for i in range(self.n):
            [a, b, c] = map(int, sys.stdin.readline().split())
            self.key[i] = a
            self.left[i] = b
            self.right[i] = c

        #adding root
        self.add_root(self.key[0])

        for i in range(1, self.n):
            self.nodes[self.key[i]] = [Node(self.key[i]),-1,-1]

        for i in range(0, self.n):
            if self.left[i] != -1:
                # adding the other left nodes
                self.add_left(self.key[self.left[i]], self.nodes[self.key[i]][0])

            if self.right[i] != -1:
                # adding the other right nodes
                self.add_right(self.key[self.right[i]], self.nodes[self.key[i]][0]) 
 类似资料:
  • 我最近开始学习数据结构和算法。我正在创建一个二叉树,它只在树的左侧添加节点。我如何创建这样一种方式,即它应该在根节点的两侧添加节点,并如下所示: 以下是我编写的代码: 主要类别:

  • 我正在用C编写一个简单的二叉树程序,现在它只存储在根节点输入的最新值,例如,如果我在树中输入10,然后在树中输入9,那么9只是覆盖10作为根节点,所以树只存储值9。 我在网上查看了多个C二叉树解决方案,并尝试了它们的实现版本,但仍然没有成功。 这是树中单个节点的结构 到目前为止,我的二叉树课程 插入方法 然后在这样的菜单中调用这个方法 逻辑对我来说似乎都很好,除了我尝试不使用构造函数而只是单独设置

  • 我想在布局的右侧和底部添加一个光影。我尝试使用,但它在布局的所有四面都添加了一个厚厚的阴影。我需要创建和设置什么绘图器作为背景?

  • 问题内容: 我想在的标题上添加一个小图标。因此,我设置了一个空标题并添加了一个包含a 和as的图形。这样,图标显示在文本结尾附近。我希望它始终显示在的右侧边框旁边。我怎样才能做到这一点?我也尝试使用a 并将其添加到中间,在右侧添加,但是没有获得TitledPane的最大大小。所以我试图将MaxWidth设置为Max- Value,但这没有帮助 有人知道该怎么办吗? 编辑:我创建的“自定义”控件将在

  • 注:Stream-1为主流,Stream-2为侧输入。主流正在不断从Kafka那里获取数据。对于侧输入,最初在应用程序启动时从DB加载所有表数据,然后在表数据更新时读取新数据(不频繁)。 示例结构: 我被指为以下链接。 用缓慢发展的数据连接流:我们用于丰富的侧输入是随着时间发展的(数据是从DB读取的)。这可以通过等待一些初始数据可用,然后处理主输入,并在新数据到达时不断地将其摄取到内部输入结构中来

  • 问题内容: 我试图在 UINavigationBar的* 右侧添加 自定义视图 。我尝试了以下操作,但是视图未显示!请帮助,在此先感谢! * 问题答案: //创建uiview并添加三个自定义按钮