我刚刚实现了我的第一个二叉树:
class BinaryTree:
def __init__(self, obj):
self.key = obj
self.left_c = None
self.right_c = None
def insert_left_c(self, new_node):
if self.left_c == None:
self.left_c = BinaryTree(new_node)
else:
temp = BinaryTree(new_code)
temp.left_c = self.left_c
self.left_c = temp
def insert_right_c(self, new_node):
if self.right_c == None:
self.right_c = BinaryTree(new_node)
else:
temp = BinaryTree(new_code)
temp.right_c = self.right_c
self.right_c = temp
def set_root(self, obj):
self.key = obj
def get_root(self):
return self.key
def get_left_c(self):
return self.left_c
def get_right_c(self):
return self.right_c
我正在努力了解你如何实际建立一个树到一个规格。举个例子,我正在尝试构建以下树:
然而,我真的很难理解/可视化你如何构建较低的节点并操纵它们的左/右分支。
我虽然可能会做以下事情:
binary_tree = BinaryTree('a')
binary_tree.insert_left_c('b')
binary_tree.insert_right_c('d')
binary_tree.insert_right_c('c')
binary_tree.insert_left_c('e')
binary_tree.insert_right_c('f')
但我意识到这是荒谬的,因为我相信我会为同一级别的所有字母创建一个独特的节点?我从来没有真正让一个人成为另一个孩子(?)。
如果有人能够解释如何解决这个问题,并想象出类似的问题,我会非常感激。
答案 0 :(得分:1)
您的insert
函数仅在根上运行,而不会在树中更深入地运行。通常,这样的函数会插入到二进制搜索树中,向左或向右递归,具体取决于插入值与当前树的根的比较方式。对于常规二叉树,您可能希望传递左/右方向的显式列表以指定新值的位置。
显式构建树会更简单。从每个叶子的单个树开始,然后合并它们。
trees = {x: BinaryTree(x) for x in 'abcdef'}
binary_tree = trees['a']
binary_tree.left_c = trees['b']
binary_tree.right_c = trees['c']
trees['b'].right_c = trees['d']
trees['c'].left_c = trees['e']
trees['c'].right_c = trees['f']