
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data; //数据元素
struct node* lchild; //指向左孩子结点
struct node* rchild; //指向右孩子结点
int ltag, rtag;
} BTNode;
void InitBiTree(BTNode*& T)
{
T=NULL;
}
void CreateBTree(BTNode*& b, char* str) //创建二叉树
{
BTNode* St[MaxSize], * p = NULL;
int top = -1, k, j = 0;
char ch;
b = NULL; //建立的二叉树初始时为空
ch = str[j];
while (ch != '\0') //str未扫描完时循环
{
switch (ch)
{
case '(':top++; St[top] = p; k = 1; break; //为左孩子结点
case ')':top--; break;
case ',':k = 2; break; //为孩子结点右结点
default:p = (BTNode*)malloc(sizeof(BTNode));
p->data = ch; p->lchild = p->rchild = NULL;
if (b == NULL) //*p为二叉树的根结点
b = p;
else //已建立二叉树根结点
{
switch (k)
{
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->lchild);
DestroyBTree(b->rchild);
free(b);
}
}
BTNode* FindNode(BTNode* b, ElemType x) //查找值为x的结点
{
BTNode* p;
if (b == NULL)
return NULL;
else if (b->data == x)
return b;
else
{
p = FindNode(b->lchild, x);
if (p != NULL)
return p;
else
return FindNode(b->rchild, x);
}
}
BTNode* LchildNode(BTNode* p)
{
return p->lchild;
}
BTNode* RchildNode(BTNode* p)
{
return p->rchild;
}
int BTHeight(BTNode* b) //求二叉树b的高度
{
int lchildh, rchildh;
if (b == NULL) return(0); //空树的高度为0
else
{
lchildh = BTHeight(b->lchild); //求左子树的高度为lchildh
rchildh = BTHeight(b->rchild); //求右子树的高度为rchildh
return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 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 visite(BTNode* b)
{
if (b == NULL)
printf("The node does not exist");
else
printf("%c", b->data);
}
void printBiTree(BTNode* T, int level)
{
if (T != NULL)
{
printBiTree(T->rchild, level + 1);
if (level != 0)
{
for (int i = 0; i < 4 * (level - 1); i++)
{
printf("%s", "");
}
printf("%s", "---");
}
visite(T);
printf("\n");
printBiTree(T->lchild, level + 1);
}
}
int leafNodes(BTNode* T)
{
if (T == NULL)return 0;
else if(T->lchild == NULL && T->rchild == NULL)return 1;
else return leafNodes(T->lchild) + leafNodes(T->rchild);
}
int CountLeaf(BTNode*b)
{
static int LeafNum = 0;//叶子初始数目为0,使用静态变量//静态局部变量,防止下一次被初始化
if (b)//树非空
{
if (b->rchild == NULL && b->lchild == NULL)//为叶子结点
LeafNum++;//叶子数目加1
// else//不为叶子结点
// {
CountLeaf(b->rchild);//递归统计左子树叶子数目
CountLeaf(b->lchild);//递归统计右子树叶子数目
// }
}
return LeafNum;
}
void InOrderTraverse(BTNode* T)
{
if (T != NULL)
{
InOrderTraverse(T->lchild);
visite(T);
InOrderTraverse(T->rchild);
}
}
void LevelTraverse(BTNode* T)
{
BTNode* p;
BTNode* qu[MaxSize];
int front, rear;
front = rear = -1;
rear++;
qu[rear] = T;
while (front != rear)
{
front = (front + 1) % MaxSize;
p = qu[front];
visite(p);
if (p->lchild != NULL)
{
rear = (rear + 1) % MaxSize;
qu[rear] = p->lchild;
}
if(p->rchild!=NULL)
{
rear = (rear + 1) % MaxSize;
qu[rear] = p->rchild;
}
}
}
BTNode* pre;
void Thread(BTNode*& p)
{
if (p != NULL)
{
Thread(p->lchild);
if (p->lchild == NULL)
{
p->lchild = pre;
p->ltag = 1;
}
else p->ltag = 0;
if (pre->rchild == NULL)
{
pre->rchild = p;
pre->rtag = 1;
}
else pre->rtag = 0;
pre = p;
Thread(p->rchild);
}
}
BTNode* CreaThread(BTNode* b)
{
BTNode* root;
root = (BTNode*)malloc(sizeof(BTNode));
root->ltag = 0; root->rtag = 1; root->rchild = b;
if (b = NULL)
root->lchild = root;
else{
root->lchild = b;
pre = root;
Thread(b);
pre->lchild = root;
pre->rtag = 1;
root->rchild = pre;
}
return root;
}
int main()
{
BTNode* b, * p, * lp, * rp;;
int level ;
printf("二叉树的基本运算如下:\n");
printf(" (1)创建二叉树\n");
char str[] = "A(B(D,E(H(J,K))),C(,G))";
CreateBTree(b, str);
printf(" (2)输出二叉树:"); DispBTree(b); printf("\n");
printf(" (3)H结点:");
p = FindNode(b, 'H');
if (p != NULL)
{
lp = LchildNode(p);
if (lp != NULL)
printf("左孩子为%c ", lp->data);
else
printf("无左孩子 ");
rp = RchildNode(p);
if (rp != NULL)
printf("右孩子为%c", rp->data);
else
printf("无右孩子 ");
}
printf("\n");
printf(" (4)二叉树b的高度:%d\n", BTHeight(b));
printf(" (5)释放二叉树b\n");
printf("(6)二叉树的叶子节点:%d\n", CountLeaf(b));
/*printf("(7)横向输出二叉树:%d\n", printBiTree(b));*/
printf("(8)所有叶子的节点个数:%d\n", leafNodes(b));
printf("(9)中序遍历二叉树:%d\n", InOrderTraverse(b));
printf("(10)层次遍历二叉树:%d\n", LevelTraverse(b));
DestroyBTree(b);
return 1;
}