typedef struct node {
ElemType data;
struct node* lchild;
struct node* rchild;
}BTNode;
创建
void CreateBTree(BTNode*& b, char* str)
{
BTNode* st[MAXSIZE], * p = NULL;
b = NULL;
int top = -1;
int j = 0, i = 0;
char ch = str[j];
while (ch != ‘\0‘)
{
switch (ch)
{
case‘(‘:
top++;
st[top] = p;
i = 1;
break;
case‘)‘:
top--;
break;
case‘,‘:
i = 2;
break;
default:
p = (BTNode*)malloc(sizeof(BTNode));
p->data = ch;
p->lchild = p->rchild = NULL;
if (b == NULL)
b = p;
else
{
switch (i)
{
case 1:
st[top]->lchild = p; break;
case 2:
st[top]->rchild = p; break;
}
}
}
j++;
ch = str[j];
}
}
销毁
void DestroyBTree(BTNode*& b)
{
if (b != NULL)
{
DestroyBTree(b->rchild);
DestroyBTree(b->rchild);
free(b);
}
}
查找结点
BTNode* FindNode(BTNode* b, ElemType x)
{
if (b == NULL)
return NULL;
else if (b->data == x)
return b;
else
{
if (FindNode(b->lchild, x) != NULL)
return FindNode(b->lchild, x);
else
return FindNode(b->rchild, x);
}
}
求树高
int BTHeight(BTNode* b)
{
int lchild, rchild;
if (b == NULL)
return 0;
else
{
lchild = BTHeight(b->lchild);
rchild = BTHeight(b->rchild);
return lchild > rchild ? (lchild + 1) : (rchild + 1);
}
}
输出
void DispBTree(BTNode* b)
{
if (b != NULL)
{
printf("%c", b->data);
if (b->lchild != NULL || b->rchild != NULL)
{
printf("(");
DispBTree(b->lchild);
if (b->rchild != NULL)
printf(",");
DispBTree(b->rchild);
printf(")");
}
}
}
前序遍历
void PreOrder(BTNode* b)
{
if (b != NULL)
{
printf("%c", b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
中序遍历
void InOrder(BTNode* b)
{
if (b != NULL)
{
InOrder(b->lchild);
printf("%c", b->data);
InOrder(b->rchild);
}
}
后序遍历
void PostOrder(BTNode* b)
{
if (b != NULL)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c", b->data);
}
}
求结点数
int Nodes(BTNode* b)
{
if (b == NULL)
return 0;
else
return(Nodes(b->lchild) + Nodes(b->rchild) + 1);
}
输出所有叶子结点
void DispLeaf(BTNode* b)
{
if (b != NULL)
{
if (b->lchild == NULL && b->rchild == NULL)
printf("%c", b->data);
DispLeaf(b->lchild);
DispLeaf(b->rchild);
}
}
原文:https://www.cnblogs.com/KIROsola/p/11432096.html