简体   繁体   English

使用节点值而不是项号遍历非二叉树

[英]Traverse a non binary tree using node values instead of item numbers

I want to create a non binary tree with 9 top level children, each of those children to have 8 children, each of those children to have 7 children, and so on..我想创建一个有 9 个顶级孩子的非二叉树,每个孩子有 8 个孩子,每个孩子有 7 个孩子,依此类推..

I also want to be able to update data in these children by calling the appropriate node using it's value, a data item.我还希望能够通过使用它的值(一个数据项)调用适当的节点来更新这些子节点中的数据。 Here is my code with comments:这是我的带有注释的代码:

import math导入数学

class NonBinTree:
    def __init__(self, value):
        self.value = value
        self.numTraverse = 0
        self.wins = 0
        self.UCB = 0
        self.nodes = []

    def add_node(self,value):
        self.nodes.append(NonBinTree(value))

    def read_numTraverse(self):
        return self.numTraverse

    def read_wins(self):
        return self.wins

    def read_value(self):
        return self.value

    def read_UCB(self):
        return self.UCB

    def update_number_times_traversed(self, data):
        self.numTraverse = self.numTraverse + data

    def update_wins(self, data):
        self.wins = self.wins + data

    def update_UCB(self):
        self.UCB = self.wins/self.numTraverse + (2*math.log(10,self.numTraverse)/self.numTraverse)

    def check_has_node(self, x):
        if self.value == x:
            return True
        else:
            y = False
            count = len(self.nodes)
            for i in range(count):
                if(self.nodes[i].read_value() == x):
                    y = True
                    break
            return y

    def __repr__(self):
        return f"NonBinTree({self.value}): {self.nodes}, {self.numTraverse}"

treeHead = NonBinTree(-1)

choices = [1,3,2]

for i in range(9):
    treeHead.add_node(i)

#the 0's here would be different numbers not all 0's
for i in range(9):
    for x in range(8):
        treeHead.nodes[i].add_node(0)

for i in range(9):
    for x in range(8):
        for y in range(7):
            treeHead.nodes[i].nodes[x].add_node(0)

# update tree after every choice
def update_tree(choices):
    count = len(choices)
    if(count==1):
        treeHead.nodes[choices[0]-1].update_number_times_traversed(1)
    elif(count==2):
        if(choices[1]>choices[0]):
            treeHead.nodes[choices[0] - 1].nodes[choices[1] - 2].update_number_times_traversed(1)
        else:
            treeHead.nodes[choices[0] - 1].nodes[choices[1] - 1].update_number_times_traversed(1)
    elif(count==3):
        if(choices[2]>choices[1]):
            if (choices[1] > choices[0]):
                treeHead.nodes[choices[0] - 1].nodes[choices[1] - 2].nodes[choices[2] - 2].update_number_times_traversed(1)
            else:
                if (choices[2] > choices[0]):
                    treeHead.nodes[choices[0] - 1].nodes[choices[1] - 1].nodes[choices[2] - 2].update_number_times_traversed(1)
                else:
                    treeHead.nodes[choices[0] - 1].nodes[choices[1] - 1].nodes[choices[2] - 1].update_number_times_traversed(1)
        else:
            if (choices[0] > choices[1]):
                treeHead.nodes[choices[0] - 1].nodes[choices[1] - 1].nodes[choices[2] - 1].update_number_times_traversed(1)
            else:
                if (choices[2] > choices[0]):
                    treeHead.nodes[choices[0] - 1].nodes[choices[1] - 2].nodes[choices[2] - 1].update_number_times_traversed(1)
                else:
                    treeHead.nodes[choices[0] - 1].nodes[choices[1] - 2].nodes[choices[2] - 2].update_number_times_traversed(1)

Instead of an update like treeHead.nodes[choices[0]-1].update_number_times_traversed(1) I would like to update using the value of a node, for example in pseudo code: treeHead.nodes[value:1].nodes[value:19].update_number_times_traversed(1) Is this possible?而不是像 treeHead.nodes[choices[0]-1].update_number_times_traversed(1) 这样的更新,我想使用节点的值进行更新,例如在伪代码中:treeHead.nodes[value:1].nodes[ value:19].update_number_times_traversed(1) 这可能吗?

for this self.nodes = [] cannot be a list, but instead a dict:对于这个self.nodes = []不能是一个列表,而是一个字典:

{
  <value_1>: <node1>,
  <value_2>: <node2>,
  <value_3>: <node3>,
}

You can define it like:您可以像这样定义它:

self.nodes: Dict[int, NonBinTree] = {}

or或者

self.nodes = defaultdict(NonBinTree)

to add a node you just do:添加一个你刚刚做的节点:

   def add_node(self, value):
        self.nodes[value] = NonBinTree(value)

WARNING : value will have to be unique, otherwise you'd overwrite another node警告:值必须是唯一的,否则你会覆盖另一个节点

  • treeHead.nodes[value:1] syntax won't work though. treeHead.nodes[value:1]语法不起作用。
  • treeHead.nodes[value].nodes will still work treeHead.nodes[value].nodes仍然可以工作

If you want to do more complex things, self.nodes would need to be an instance of a data structure class you define, allowing slicing, index based access, etc etc如果您想做更复杂的事情,self.nodes 需要是您定义的数据结构 class 的实例,允许切片、基于索引的访问等

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

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