[英]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.