二叉树(C++)

#include <stdio.h>
#include <stdlib.h>

//定义二叉链表节点的存储结构
typedef struct BiTNode
{
int data;
struct BiTNode* lchild;   //左指针
struct BiTNode* rchild;  //右指针
}BiTNode, *BiTree;    //将BiTree定义为指向二叉链表结点结构的指针类型

//创建二叉链表结点,创建成功返回结点指针,失败返回空
BiTree Create(int x, BiTree lbt, BiTree rbt)

{

     //生成一棵以x为根结点的数据域值以lbtrbt为左右子树的二叉树

BiTree p;
if ((p = (BiTNode*)malloc(sizeof(BiTNode))) == NULL)
{
return NULL;
}


p->data = x;
p->lchild = lbt;
p->rchild = rbt;


return p;
}


//在左子树插入结点

BiTree InsertL(BiTree bt, int x, BiTree parent)
{

BiTree p;

       //判断bt的结点parent是否为空

if (parent == NULL)
{
printf("插入出错\n");
return NULL;
}

        //申请结点空间
if ((p = (BiTNode*)malloc(sizeof(BiTNode))) == NULL)
{
return NULL;
}

        //初始化新结点
p->data = x;
p->lchild = NULL;
p->rchild = NULL;

        //如果bt的parent的lchild为空,直接指向新结点
if (parent->lchild == NULL)
{
parent->lchild = p;
}
else
{
p->lchild = parent->lchild;  //让新节点的lchild指向parent的lchild
parent->lchild = p;    //parent的lchild指向新节点
}


return bt;  //返回结点指针
}


//在右子树插入结点(原理同上)

BiTree InsertR(BiTree bt, int x, BiTree parent)
{
BiTree p;
if (parent == NULL)
{
printf("插入出错\n");
return NULL;
}


if ((p = (BiTNode*)malloc(sizeof(BiTNode))) == NULL)
{
return NULL;
}


p->data = x;
p->lchild = NULL;
p->rchild = NULL;


if (parent->rchild == NULL)
{
parent->rchild = p;
}
else
{
p->rchild = parent->rchild;
parent->rchild = p;
}


return bt;
}


//删除左子树的叶子结点

BiTree DeleteL(BiTree bt, BiTree parent)
{

BiTree p;

        //parent结点为空或者parent的左子树为空,删除失败

if (parent == NULL || parent->lchild == NULL)
{
printf("删除出错\n");
return NULL;
}


p = parent->lchild;  //将parent的左子树地址赋给p
parent->lchild = NULL; //让左子树指向空
free(p);


return bt;
}

//删除右子树的叶子节点
BiTree DeleteR(BiTree bt, BiTree parent)
{
BiTree p;
if (parent == NULL || parent->rchild == NULL)
{
printf("删除出错\n");
return NULL;
}


p = parent->rchild;
parent->rchild = NULL;
free(p);


return bt;
}


BiTree Search(BiTree bt, int x)

{

       //判断根节点是否为空

if (NULL == bt)
{
return NULL;
}

       //判断根节点数据是否是要寻找的
if (bt->data == x)
{
printf("查找成功\n");
return bt;
}


BiTree tree = NULL;
tree = Search(bt->lchild, x);   //递归查找左子树,查找结果返回值保存在tree中
if (NULL == tree)
{//tree 为空左子树没有,遍历右子树
tree = Search(bt->rchild, x);
}


return tree;
}

//输出二叉链表,这里用中序遍历实现的
void Output(BiTree bt)
{
if (NULL == bt)
{
return;
}


Output(bt->lchild);
printf("->%d", bt->data);
Output(bt->rchild);
}


int main(int argc, char* argv[])
{
BiTree t1 = Create(1, NULL, NULL);  //左子树的叶子节点
BiTree t2 = Create(2, t1, NULL);
BiTree t5 = Create(5, NULL, NULL);  //右子树中的叶子节点
BiTree t6 = Create(6, NULL, NULL);   //同上
BiTree t4 = Create(4, t5, t6);
BiTree t3 = Create(3, t2, t4);   //根节点


printf("t1 tree:");
Output(t1);
printf("\n");      


printf("t3 tree:");
Output(t3);
printf("\n");


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值