为了在洛谷上刷题写的程序,详情见注释
class Node: #树节点类
def __init__(self,name,left=None,right=None):
self.name = name #节点名称(或编号)
self.left = left #节点的左孩子
self.right = right #节点的右孩子
def tree_append(head,name,append_name,l_or_r):
'''参数:
head 二叉树的头节点
name 要插入节点的父节点的名称
append_nane 要插入节点的名称
l_or_r 要插入的节点是其父节点的左孩子还是右孩子
'''
if head.name == name: #如果找到了,进行插入。
#注意:如果插入位置已存在节点,将会替换掉原来的节点,并删除其左右子树
#新插入节点一定是叶子节点
if l_or_r == 'l':
head.left = Node(append_name)
elif l_or_r == 'r':
head.right = Node(append_name)
return 'target_founded' #返回值没有什么用处,但可以用来debug
#如果没有找到,递归查找其左右子树
if head.left:
if head.right:
return (tree_append(head.left,name,append_name,l_or_r),tree_append(head.right,name,append_name,l_or_r))
#如果都有左右孩子,则都进行查找
else:
return tree_append(head.left,name,append_name,l_or_r)
#如果只有左孩子,则只查找左子树
elif head.right:
return tree_append(head.right,name,append_name,l_or_r)
#如果只有右孩子,则只查找右子树
else:
return 'reach_leave' #没有左右孩子,说明是叶子节点,return返回
#以下是测试部分
#创建一个二叉树,头节点为a,其左孩子为b,右孩子为c。
h = Node('a',Node('b'),Node('c'))
tree_append(h,'c','d','r') #将一个名为d的节点插入为c的右节点
print(h.right.name)