自己写的二叉树插入程序

为了在洛谷上刷题写的程序,详情见注释

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种重要的数据结构,C语言提供了许多灵活的方式来实现它。 以下是一个示例程序,展示了如何用C语言来实现二叉树插入操作: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node *left; struct Node *right; }; struct Node* newNode(int data) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->data = data; node->left = NULL; node->right = NULL; return node; } struct Node* insert(struct Node* node, int data) { if (node == NULL) return newNode(data); if (data < node->data) node->left = insert(node->left, data); else if (data > node->data) node->right = insert(node->right, data); return node; } void inorderTraversal(struct Node* node) { if (node == NULL) return; inorderTraversal(node->left); printf("%d ", node->data); inorderTraversal(node->right); } int main() { struct Node* root = NULL; root = insert(root, 50); insert(root, 30); insert(root, 20); insert(root, 40); insert(root, 70); insert(root, 60); insert(root, 80); inorderTraversal(root); return 0; } ``` 在上述代码中,我们使用了一个 `struct Node` 结构体来表示二叉树的每个节点。`newNode` 函数用于创建一个新的节点,并初始化它的值和指向左右子节点的指针。`insert` 函数用于插入一个新的节点到二叉树中,如果当前节点为空,就创建一个新的节点;否则,根据当前节点的值和待插入节点的值的比较结果,递归地调用 `insert` 函数,直到找到合适的位置。`inorderTraversal` 函数用于按照中序遍历的方式遍历整棵二叉树,并输出每个节点的值。 在主函数中,我们创建了一个空的根节点,并按照顺序插入了一些节点。最后,我们通过调用 `inorderTraversal` 函数来遍历整棵二叉树,并输出每个节点的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值