跟踪树节点';Python中的父对象
我有一棵数字树。每个节点都可以有一个左、右子节点。数字不能重复,但它们可以在树上的任何地方。我需要在树上搜索一个数字,然后打印它到树根的路径 我无法找到一种方法使节点跟踪谁是它的父节点,以便将它们打印回根节点。我怎样才能做到这一点 代码如下:跟踪树节点';Python中的父对象,python,Python,我有一棵数字树。每个节点都可以有一个左、右子节点。数字不能重复,但它们可以在树上的任何地方。我需要在树上搜索一个数字,然后打印它到树根的路径 我无法找到一种方法使节点跟踪谁是它的父节点,以便将它们打印回根节点。我怎样才能做到这一点 代码如下: # The Tree class holds a value and left and right childs class Tree: def __init__(self, value, left=None, right=None):
# The Tree class holds a value and left and right childs
class Tree:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
# recursive function that searches the tree for a node
# and alerts when the node is found
def searchNode(tree, node):
if tree == None:
return
else:
searchNode(tree.left,node)
searchNode(tree.right,node)
if tree.value == node:
print "Node " + str(node) + " found!"
# manually creating a tree with its subtrees
tree1 = Tree(1,Tree(40,Tree(33,left=Tree(204)),
Tree(21,left=Tree(12,right=Tree(2,left=Tree(32))))),
Tree(7,Tree(46),Tree(11,Tree(3),Tree(1000))))
# searching tree
searchNode(tree1, 46)
我相信您使用树来查找O(n)而不是O(logn)是有原因的,即不使用二叉搜索树,所以我不会质疑:) 为了解决问题,可以向函数中添加第三个参数来维护路径。以下是一个非常简单且效率低下的解决方案
def searchNode(tree, node, path):
if tree == None:
return
else:
#print tree.value
path.append(tree.value) #add to path because we visited
searchNode(tree.left,node, path)
searchNode(tree.right,node, path)
if tree.value == node:
print "Node " + str(node) + " found!"
print path
else:
path.pop() #remove from path because we are going back
您将使用空路径调用函数:searchNode(tree1,46,[])
请注意,即使在找到元素后,
path
中的值仍将继续更改,因为没有任何东西阻止函数进一步遍历树。通过防止这种情况,可以提高代码的效率。如果不想这样做,请在找到节点时将path
中的值复制到其他变量中,以便以后使用 递归。但是首先你需要学习递归,在那之前。。。递归。另外,当您学习完递归之后,您需要学习递归。另外,如果您正在尝试任何递归,我建议添加定义的返回语句,这样您就更有可能正确地将信息传递回堆栈。非常简单,这正是我想要的。谢谢你,阿里。