如果二叉树为:
a
b c
d e
由于程序中要知道叶子结点(终点)。所以要讲上面的二叉树变成扩展二叉树(把叶子结点的孩子补成#,用作标记),扩展后就变成了:
a
b c
# d # e
# # # #
那么在输入的时候,须要输入ab#d##c#e##(输入后直接回车就可以)
#include <stdio.h>#include<stdlib.h>
#define ElemType char
//节点声明,数据域、左孩子指针、右孩子指针
typedef struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree createBiTree()
{
BiTree T;
char ch;
scanf("%c", &ch);
if (ch == '#')
T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = createBiTree();
T->rchild = createBiTree();
}
return T;
}
以下就是二叉树的遍历。遍历是通过递归进行遍历
//先序遍历void PreorderTraverse(BiTree T)
{
if (T)
{
printf("%c\n", T->data);
PreorderTraverse(T->lchild);
PreorderTraverse(T->rchild);
}
}
//中序遍历
void InorderTraverse(BiTree T)
{
if (T)
{
PreorderTraverse(T->lchild);
printf("%c\n", T->data);
PreorderTraverse(T->rchild);
}
}
//后序遍历
void PostorderTraverse(BiTree T)
{
if (T)
{
PreorderTraverse(T->lchild);
PreorderTraverse(T->rchild);
printf("%c\n", T->data);
}
}
二叉树高度的求法返回T所指向的二叉树的高度
处理方法:1.若T为空则返回0否则
2.求出左右子树的高度L1和L2。并返回两者之中最大的。
3.由于没有算根节点仅仅是求的左右子树。所以须要加1。
int dep(BiTree T)
{
int max;
if (T == NULL)
return 0;
else
{
max = dep(T->lchild);
if (dep(T->rchild) > max)
max = dep(T->rchild);
}
return max + 1;
}
{
int ch;
BiTree T;
printf("请利用先序插入法插入您要建立的二叉树!\n");
T = createBiTree();
while (1)
{
printf("按下列选项选择您要进行的操作\n");
printf("1前序输出.\n");
printf("2.后序输出\n");
printf("3.中序输出\n");
printf("4.退出\n");
scanf("%d", &ch);
switch (ch)
{
case 1:
PreorderTraverse(T); break;
case 2:
PostorderTraverse(T); break;
case 3:
InorderTraverse(T); break;
case 4:
return 0;
default:
break;
}
}
return 0;
}
以下是我做的一点点改进,利用c++中的指针引用将问题进行了简单的改动。以下是基本的两个函数。就是BST树的构建函数以及主函数
构建函数
这样的方法不须要返回值了,是直接对指针进行操作。
主函数的写法