解题思路: 这是一个很经典的题目,几乎所有的数据结构的书上都可以看到
这个问题的解答,这里参考了《数据结构与算法分析---C语言描述》中的描述
方式。
打印一颗二叉树最好的方法还是采用递归的方式,其实解决树和图的最基本方法
也是递归,递归有时候会把我们的脑袋转晕了,按照上面那本书中的说法,练习
递归的最好方法就是多看好的递归的例子,然后自己动手去解决一些经典的例子。
源代码:(在VC6下通过编译,正确执行)
#include <stdio.h>
#include <stdlib.h>
//树节点
struct TreeNode
{
TreeNode* left;
TreeNode* right;
int value;
};
//中序遍历一个颗二叉树
void PrintTree(TreeNode* T)
{
if(T != NULL)
{
PrintTree(T->left);
printf("%d ",T->value);
PrintTree(T->right);
}
}
//先序遍历一个颗二叉树
void PrintTreeFirst(TreeNode* T)
{
if(T != NULL)
{
printf("%d ",T->value);
PrintTreeFirst(T->left);
PrintTreeFirst(T->right);
}
}
//后序遍历一个二叉树
void PrintTreeAfter(TreeNode* T)
{
if(T != NULL)
{
PrintTreeAfter(T->left);
PrintTreeAfter(T->right);
printf("%d ",T->value);
}
}
//在二叉树上插入一个节点
TreeNode* Insert(TreeNode* T, int value)
{
if(T == NULL)
{
T = (TreeNode*)malloc(sizeof(struct TreeNode));
if( T == NULL)
printf("Malloc Failed.");
else
{
T->value = value;
T->left = T->right = NULL;
}
}
else if(value < T->value)
T->left = Insert(T->left,value);
else if(value > T->value)
T->right = Insert(T->right, value);
return T;
}
//销毁一颗二叉树
TreeNode* MakeEmpty(TreeNode* T)
{
if(T != NULL)
{
MakeEmpty(T->left);
MakeEmpty(T->right);
free(T);
}
return NULL;
}
int main()
{
TreeNode* T = NULL;
T = Insert(T,45);
T = Insert(T,21);
T = Insert(T,5);
T = Insert(T,23);
T = Insert(T,11);
PrintTree(T);//5 11 21 23 45
printf("/n");
PrintTreeFirst(T); //45 21 5 11 23
printf("/n");
PrintTreeAfter(T); // 11 5 23 21 45
MakeEmpty(T);//销毁二叉树
return 0;
}