二叉树基本实现

#include <iostream>
using namespace std;
#define TElemType char;
#define Status int;

typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;
}BiTNode,*BiTree;


Status InitBiTree(BiTree &T);
Status DestroyBiTree(BiTree& T);
Status CreateBiTree(BiTree& T);
void ClearBiTree(BiTree& T);
Status BiTreeEmpty(BiTree T);
int BiTreeDepth(BiTree T);
Status Root(BiTree T);
Status Value(BiTree T,TElemType e);
Status Assign(BiTree& T,TElemType e,TElemType value);
Status Parent(BiTree T, TElemType e);
Status LeftChild(BiTree T, TElemType e);
Status RightChild(BiTree T, TElemType e);
Status LeftSibling(BiTree T, TElemType e);
Status RightSibling(BiTree T, TElemType e);
Status InsertChild(BiTree T, BiTree p, int LR, BiTree c);
Status DeleteChild(BiTree T, BiTree p, int LR);

Status InitBiTree(BiTree& T)//构造空二叉树
{
	T = NULL;
	return 1;
}

Status DestroyBiTree(BiTree& T)//销毁二叉树
{
	if ((T)->lchild)
		DetroyBiTree(T->lchild);
	if ((T)->rchild)
		DetroyBiTree(T->rchild);
	free(T);
	T = NULL;
	return 1;
}

Status CreateBiTree(BiTree& T)//根据定义构造二叉树
{
	TElemType ch;
	scanf("%c", &ch);
	if (ch == ' ')
		T = NULL;
	else
	{
		T = (BiTree)malloc(sizeof(BiNode));
		if (!T)
			exit(_OVERFLOW);
		T->data = ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
	return 1;

}

void ClearBiTree(BiTree& T)//将二叉树T清为空树
{
	if (T)
	{
		if ((T)->lchild)
			ClearBiTree(T->lchild);
		if ((T)->rchild)
			ClearBiTree(T->rchild);
		free(T);
		T = NULL;
	}
}

Status BiTreeEmpty(BiTree& T)
{
	if (T)
		return 0;
	else
		return 1;
}

int BiTreeDepth(BiTree T)
{
	int i, j;
	if (!T)
		return 0;
	if (T->lchild)
		i = BiTreeDepth(T->lchild);
	else
		i = 0;
	if (T->rchild)
		i = BiTreeDepth(T->rchild);
	else
		i = 0;
	return i > j ? i + 1 : j + 1;
}

Status Root(BiTree T)//二叉树存在则返回二叉树的根
{
	cout << T->data << endl;
	return 1;
}

Status Value(BiTree T, TElemType e)//二叉树存在,e是T中某个结点,返回e的值
{
	if (T->data == e)
		return 1;
	else
	{
		int i = 1, j = 0;
		if (T->lchild)
			i = Value(T->lchlid, e);
		if (T->rchild)
			j = Value(T->rchlid, e);
		if (i || j)
			return 1;
		else
			return 0;
	}
	return 0;
}

Status Assign(BiTree& T, TElemType e, TElemType value)//结点e赋值为value
{
	if (T->data == e)
	{
		T->data = value;
		return 1;
	}
	else
	{
		int i = 0, j = 0;
		if (T->lchild)
		{
			i = Assign(T->lchlid, e, value);
		}
		if (T->rchild)
		{
			j = Assign(T->rchild, e, value);
		}
		if (i || j)return 1;
		else return 0;
	}
	return 0;
}

Status Parent(BiTree T, TElemType e)//若e是T的非根结点,则返回它的双亲,否则返回空
{
	if (T->lchild && T->lchild->data == e)
	{
		printf("双亲结点为:%c\n", T->data);
		return 1;
	}
	else if (T->rchild && T->rchild->data == e)
	{
		printf("双亲结点为:%c\n", T->data);
		return 1;
	}
	else
	{
		if (T->lchild)
		{
			Parent(T->lchlid, e);
		}
		if (T->rchild)
		{
			Parent(T->rchild, e);
		}
	}
	return 0;
}



Status LeftChild(BiTree T, TElemType e)//返回e的左孩子,若e无左孩子,则返回空
{
	if (T->data == e && T->lchild)
	{
		printf("左孩子结点为:%c\n", T->lchlid->data);
		return 1;
	}
	else
	{
		if (T->lchild)
		{
			LeftChild(T->lchild, e);
		}
		if (T->rchild)
		{
			LeftChild(T->rchild, e);
		}
	}
	return 0;
}

Status RightChild(BiTree T, TElemType e)//返回e的右孩子,若e无右孩子,则返回空
{
	if (T->data == e && T->rchild)
	{
		printf("右孩子结点为:%c\n", T->rchild->data);
		return 1;
	}
	else
	{
		if (T->lchild)
		{
			RightChild(T->lchild, e);
		}
		if (T->rchild)
		{
			RightChild(T->rchild, e);
		}
	}
	return 0;
}

Status LeftSibling(BiTree T, TElemType e)//返回e的左兄弟,若e是T的左孩子或无左兄弟,则返回空
{
	if (T->lchild && T->rchild->data == e)
	{
		printf("左兄弟结点为:%c\n", T->lchild->data);
		return 1;
	}
	else
	{
		if (T->lchild)
		{
			LeftSiblint(T->ichild, e);
		}
		if (T->rchild)
		{
			LeftSibling(T->rchild, e);
		}
	}
	return 0;
}


Status RightSibling(BiTree T, TELemType e)//返回e的右兄弟,若e是T的右孩子或无右兄弟,则返回空
{
	if (T->rchild && T->lchild->data == e)
	{
		printf("右兄弟结点为:%c\n", T->rchild->data);
		return 1;
	}
	else
	{
		if (T->lchild)
		{
			RightSibling(T->lchild, e);
		}
		if (T->rchild)
		{
			RightSibling(T->rchild, e);
		}
	}
	return 0;
}

//二叉树T存在,p指向T中某个结点,LR为0或1,非空二叉树c与T不相交且右子树为空
//返回结果:根据LR为0或1,插入c为T中p所指向结点的左或右子树,p所指向结点的原有左或右子树则成为c的右子树
Status InsertChild(BiTree T, BiTree p, int LR, BiTree c)
{
	if (LR == 0)//c的右子树为空,使p的左子树成为c的右子树,并使增加了右子树的c成为p的左子树
	{
		c->rchild = p->lchild;
		p->lchild = c;
	}
	else//c的右子树为空,使p的右子树成为c的右子树,并使增加了右子树的c成为p的右子树
	{
		c->rchild = p->rchild;
		p->rchild = c;
	}
	return 1;
}

Status DeleteChild(BiTree T, BiTree p, int LR)
{
	if (LR == 0)//删除p的左子树
	{
		DestroyBiTree(p->lchild);
	}
	else//删除p的右子树
	{
		DestroyBiTree(p->rchild);
	}
	return 1; 
}





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值