#include <stdio.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100//存储空间初始分配量
typedef struct node
{
int data; //数据元素
struct node* lchild,* rchild; //指向左右孩子节点
} BTNode,BiTree;
//建立二叉树
void CreateBTree(BTNode*& T, const char* str)
{
BTNode* St[STACK_INIT_SIZE], * p = NULL;
int top = -1, k, j = 0;
char ch;
T = 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 (T == NULL) //*p为二叉树的根节点
T = p;
else //已建立二叉树根节点
{
switch (k)
{
case 1:St[top]->lchild = p;
break;
case 2:St[top]->rchild = p;
break;
}
}
} j++;
ch = str[j];
}
}
BTNode* FindNode(BTNode* T, int x)
{
BTNode* p;
if (T == NULL)
return NULL;
else if (T->data == x)
return T;
else {
p = FindNode(T->lchild, x);
if (p != NULL)
return p;
else
return FindNode(T->rchild, x);
}
}
BTNode* LchildNode(BTNode* p) //返回左子树
{
return p->lchild;
}
BTNode* RchildNode(BTNode* p) //返回右子树
{
return p->rchild;
}
int Height(BTNode* T) //求二叉树的高度
{
int lchildh, rchildh;
if (T == NULL) return(0); //空树的高度为0
else
{
lchildh = Height(T->lchild); //求左子树的高度为
rchildh = Height(T->rchild); //求右子树的高度为
return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 1);
}
}
void DispBTree(BTNode* T)
{
if (T != NULL)
{
printf("%c", T->data);
if (T->lchild != NULL || T->rchild != NULL)
{
printf("("); //有孩子节点时才输出
DispBTree(T->lchild); //递归处理左子树
if (T->rchild != NULL) printf(","); //有右孩子节点时才输出,
DispBTree(T->rchild); //递归处理右子树
printf(")"); //有孩子节点时才输出)
}
}
}
int main()
{
BTNode* T;
int height;
CreateBTree(T, "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//二叉树创建
printf("输入二叉树的括号表示串\n");
DispBTree(T);
printf("\n");
printf("H结点的左孩子结点值:%c\n", LchildNode(FindNode(T, 'H'))->data);
printf("H结点的右孩子结点值:%c\n", RchildNode(FindNode(T, 'H'))->data);
height = Height(T);
printf("二叉树T的高度 %d\n", height);
}
实验题2
//先序遍历
void PreOrder(BTNode *T)
{
if(T!=NULL)
{
printf("%c ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历
void InOrder(BTNode *T)
{
if(T!=NULL)
{
InOrder(T->lchild);
printf("%c ",T->data);
InOrder(T->rchild);
}
}
//后序遍历
void PostOrder(BTNode *T)
{
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c ",T->data);
}
}
int main()
{
BTNode* T;
int height;
CreateBTree(T, "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//二叉树创建
printf("输入二叉树的括号表示串\n");
DispBTree(T);
printf("\n");
/*printf("H结点的左孩子结点值:%c\n", LchildNode(FindNode(T, 'H'))->data);
printf("H结点的右孩子结点值:%c\n", RchildNode(FindNode(T, 'H'))->data);
height = BTHeight(T);
printf("二叉树T的高度 %d\n", height);*/
printf("先序遍历结果为:\n");
PreOrder(T);
printf("\n");
printf("中序遍历结果为:\n");
InOrder(T);
printf("\n");
printf("后序遍历结果为:\n");
PostOrder(T);
return 0;
}
实验题3
//结点个数
int Nodes(BTNode *T)
{
int num1,num2;
if(T==NULL)
return 0;
else
return Nodes(T->lchild)+Nodes(T->rchild)+1;
}
//叶子结点个数
int LeafNodes(BTNode *T)
{
if(!T)
return 0; //空树,无叶子
else if(!T->lchild && !T->rchild)
return 1;
else
return (LeafNodes(T->lchild) + LeafNodes(T->rchild));
}
int main()
{
BTNode* T;
int height;
CreateBTree(T, "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//二叉树创建
printf("输入二叉树的括号表示串\n");
DispBTree(T);
/*printf("H结点的左孩子结点值:%c\n", LchildNode(FindNode(T, 'H'))->data);
printf("H结点的右孩子结点值:%c\n", RchildNode(FindNode(T, 'H'))->data);
height = BTHeight(T);
printf("二叉树T的高度 %d\n", height);
printf("先序遍历结果为:\n");
PreOrder(T);
printf("\n");
printf("中序遍历结果为:\n");
InOrder(T);
printf("\n");
printf("后序遍历结果为:\n");
PostOrder(T);
return 0; */
printf("\n树的结点数是%d", Nodes(T));
printf("\n树的叶子数是%d", LeafNodes(T));
}