二叉树的相关操作

本文详细介绍了二叉树的各种操作,包括从先序遍历结果创建二叉树、克隆二叉树、销毁二叉树、计算节点数量、叶子节点数量、第K层节点数、树的高度、判断节点是否存在以及查找节点的父节点。通过实例代码和测试结果展示每种操作的实现过程。
摘要由CSDN通过智能技术生成

二叉树的遍历在前文二叉树的基本操作已经提到,接下来再分享一些二叉树的其他操作
1.二叉树的创建
给一个二叉树的先序遍历结果,空节点用”#”表示,然后进行创建
这里写图片描述
实现代码:

TreeNode* CreateTreeNode(TreeNodeType value)
{
    TreeNode* new_node = (TreeNode*)malloc(sizeof(TreeNode));
    new_node->data = value;
    new_node->lchild = NULL;
    new_node->rchild = NULL;
    return new_node;
}
TreeNode* _TreeCreate(TreeNodeType data[],size_t size,size_t* index,TreeNodeType null_node)
{
    if(index == NULL)
    {
        return NULL;
    }
    if((*index) >= size)
    {
        return NULL;
    }
    if(data[*index] == null_node)
    {
        return NULL;
    }
    TreeNode* new_node = CreateTreeNode(data[*index]);
    ++(*index);
    new_node->lchild = _TreeCreate(data,size,index,null_node);
    ++(*index);
    new_node->rchild = _TreeCreate(data,size,index,null_node);
    return new_node;
}
TreeNode* TreeCreate(TreeNodeType data[],size_t size,char null_node)
{
    size_t index = 0;//表示当前取数组的哪个元素
    return _TreeCreate(data,size,&index,null_node);
}

测试代码:

void TestCreate()
{
    TEST_HEADER;
    TreeNodeType data[] = "abd##eg###c#f##";
    TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
    printf("\n先序遍历:");
    TreePreOrder(root);
    printf("\n中序遍历:");
    TreeInOrder(root);
    printf("\n后序遍历:");
    TreePostOrder(root);
    printf("\n层序遍历:");
    TreeLevelOrder(root);
    printf("\n");
    return;
}

运行结果:
这里写图片描述
2.克隆一个二叉树
给一个二叉树,克隆出来一个一模一样的二叉树
这里需要解释一下:一般的Clone为深拷贝,Copy为浅拷贝
那么深浅拷贝的区别又是什么呢??
浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
这里写图片描述
实现代码:

TreeNode* TreeClone(TreeNode* root)
{
    if(root == NULL)
    {
        return NULL;
    }
    TreeNode* new_node = CreateTreeNode(root->data);
    new_node->lchild = TreeClone(root->lchild);
    new_node
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值