在前面的几期文章中,博主分享了二叉树的基本知识和三种遍历的实现,突然发现二叉树的基本操作居然还没有专门做文章分享过。这不得立刻安排!其实二叉树的基本操作很重要,以后我们很多利用二叉树的性质来解题时是经常要用到的。下面直接上干货(注意二叉树没有插入删除操作哦)
1.查找二叉树中的结点
BTNode* FindNode(BTNode* T, ElemType x)
{
BTNode* p;
if (T == NULL)
{
return NULL;
}
else if (T->data == x)
{
retrun T;
}
else
{
p = FindNode(T->lchild, x);
if (p != NULL)
{
return p;
}
else return FindNode(T->rchild, x);
}
}
2.找左孩子结点
BTNode* LchildNode(BTNode* p)
{
if (p->lchild)
{
return p->lchild;
}
else
{
return NULL;
}
}
3.找右孩子结点
BTNode* RchildNode(BTNode* p)
{
if (p->rchild)
{
return p->rchild;
}
else
{
return NULL;
}
}
4.求二叉树的高度
int BiTreeDepth(BTNode* T)
{
int idep; rdep;
if (T = NULL)
{
return 0;//空树的高度为0
}
if (T->lchild)
{
ldep = BiTreeDepth(T->lchild);//求左子树的高度为lchilddep;
}
else ldep = 0;
if (T->rchild)
{
rdep = BiTreeDepth(T->rchild);//求右子树的高度为rchilddep;
}
else rdep = 0;
return(ldep > rdep) ? (ldep + 1) : (rdep + 1);
}
5.输出二叉树
void PrintBiTree(BTNode* T)
{
if (T != NULL)
{
visit(T);
if (T->lchild != NULL || T->rchild != NULL)
{
printf("(");
PrintBiTree(T->lchild);
if (T->rchild != NULL)printf(",");
PrintBiTree(T->rchild);
printf(")");
}
}
}
6.销毁二叉树
void DestroyBiTree(BTNode*& T)
{
if (T != NULL)
{
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
free(T);
}
}
7.访问二叉树的结点
void visit(BTNode* T)
{
if (T == NULL)
{
printf("不存在该结点!");
}
else
{
printf("%c", T->data);
}
}
8.(三种遍历实现时的定义,这里直接用)
定义结点数据结构
typedef struct BiTNode
{
ElemType data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;//前一个是数据类型,后一个是指针类型
//插入根结点
void InRoot(BiTree& T, ElemType i) {
T = (BiTree)malloc(sizeof(BiTNode));//注意要申请数据类型的空间。否则会因太小而报错
T->data = i;
T->lchild = NULL;
T->rchild = NULL;
}
9.插入新结点
void InNew(BiTree& p, ElemType i)
{
p = (BiTree)malloc(sizeof(BiTNode));//注意要申请数据类型的空间。否则会因太小而报错
p->data = i;
p->lchild = p->rchild = NULL;
}
10.获得二叉树的节点数
int GetNodeNumber(Tree T)
{
if (T)
{
return GetNodeNumber(T->left) + GetNodeNumber(T->right) + 1;
}
else
{
return 0;
}
}
好啦,今天的分享就到这啦,这些基本操作大家一定很熟悉,以后才能轻松应对二叉树。
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.
3117

被折叠的 条评论
为什么被折叠?



