typedef struct node
{
struct node *lchild,rchild;
DataType data;
}*BiTree,BiNode;
BiTree *T;
/*初始化二叉树*/
void InitBiTree(BiTree *T)
{
*T = NULL;
}
/*先序递归创建二叉树*/
void CreateBiTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if(ch == '#')
*T = NULL; //这是Create函数的结尾。
else{
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
/*二叉树的销毁*/
void DestroyBiTree(BiTree *T)
{
if(*T)
{
if((*T)->lchild)
DestroyBiTree((*T)->lchild);
if((*T)->rchild)
DestroyBiTree((*T)->rchild);
free(*T);
*T = NULL; //1、 不加行不行?
}
}
//不行,T是指向这一片空间的,这片空间被释放后,
//还可以被别的项目利用,如果T仍然指向这里,会导致越界。
//初始化置空,使用完毕置空这是杜绝野指针的基本原则!
/*二叉树的左插入*/
/*p指向二叉树的某个结点,将子树 c 左插入p指向的的结点,
p原来的左子树变成c的右子树。*/
int InsertLeftChild(BiTree p, BiTree c)
{
if(p){
c->rchild = p->lchild;
p->lchild = c;
return 1;
}
return 0; //说明:p = NULL
}
/*二叉树的右插入*/
int InsertRightChild(BiTree p,BiTree c)
{
if(p){
c->rchild = p->rchild;
p->rchild = c;
return 1;
}
return 0;
}
/*返回二叉树结点元素值为 e 的指针。
MAXSIZE是树的最大结点个数*/
BiTree BiTreePoint(BiTree T,DataType e)
{
BiTree Q[MAXSIZE]; // 指针数组
int front = 0,rear = 0;
BiNode *p;
if
{
Q[rear] = T; //入栈
rear++;
while(front != rear )
{
p = Q[front];
front++;
if(p->data = e)
return p;
if(p->lchild)
Q[rear++] = p->lchild;
if(p->rchild)
Q[rear++] = p->rchild;
}
}
return NULL;
}
/*因为二叉树没有线索化,所以我们要考虑一种方法能走遍每(every)一个子节点
自然就需要指针分别向左指,再向右指。然后分别将向左指的指针入栈,向右指的指针入栈
这两个指针再分别重复以上故事。*/
/*返回数据域值为e的结点的左(右)孩子的数据域值*/
DataType LeftChild(BiTree *T)
{
BiTree p;
if(T){
p = BiTreePoint(T,e);
if( p && p->lchild)
return p->lchild->data;
}
return 0;
}
DataType RightChild(BiTree *T)
{
BiTree p;
if(T){
p = BiTreePoint(T,e);
if( p && p->rchild)
return p->rchild->data;
}
return 0;
}
/*删除二叉树的 p 所指的左(右)子树*/
int DeleteLeftChild(BiTree p)
{
if(p){
DestroyBiTree(&(p->lchild));
return 1;
}
return 0;
}
int DeleteRightChild(BiTree p)
{
if(p){
DestroyBiTree(&(p-rchild));
return 1;
}
return 0;
}
16 - 12 - 22 二叉树的基本操作
最新推荐文章于 2022-07-06 16:49:23 发布