#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)
if ((p = (BiTNode*)malloc(sizeof(BiTNode))) == NULL)
{
return NULL;
}
p->data = x;
p->lchild = lbt;
p->rchild = rbt;
return p;
}
{
{
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 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;
}
{
{
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)
{
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");
#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为根结点的数据域值以lbt和rbt为左右子树的二叉树
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 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");
}