思路:利用前序遍历来建树(结点值陆续从键盘输入,用先序遍历的顺序为宜),后序遍历销毁一个树。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
//二叉链表示法
struct _bitTree
{
int data;
struct _bitTree * lchild, *rchild;
};
typedef struct _bitTree BiTNode;
typedef struct _bitTree* BiTreee;
/*先序遍历*/
void preOrder(BiTNode * root)
{
/*先根节点*/
if (root == NULL)
{
return;
}
printf("%c\t", root->data);
/*遍历左子树*/
preOrder(root->lchild);
/*遍历右子树*/
preOrder(root->rchild);
}
BiTNode * CreateTree()
{
BiTNode * node = NULL;
char ch;
scanf("%c",&ch);
if (ch == '#')
{
return NULL;
}
else{
node = (BiTNode*)malloc(sizeof(BiTNode));//创建根节点
if (node == NULL)
{
return NULL;
}
node->data = ch;
node->lchild = CreateTree();//递归创建左子树
node->rchild = CreateTree();//递归创建右子树
return node;
}
}
/*释放内存*/
void FreeTree(BiTNode * T)
{
if (T != NULL)
{
if (T->lchild != NULL)
{
FreeTree(T->lchild);//递归释放左子树
T->lchild = NULL;
}
if (T->rchild != NULL)
{
FreeTree(T->rchild);
T->rchild = NULL;
}
free(T);
T = NULL;
}
}
int main(void)
{
BiTNode * my = NULL;
printf("please input string:");
my = CreateTree();
preOrder(my);
FreeTree(my);
printf("树释放完毕\n");
system("pause");
return 0;
}
#include <iostream>
using namespace std;
struct BiTNode{
char data;
struct BiTNode* lchild,* rchild; // 左右孩子
};
void CreatBiTree(BiTNode* &T){ // 先序递归创建二叉树
// 先按顺序驶入二叉树中节点的值(一个字符),空格字符代表空树
char ch;
for (int j = 0; j < 13; ++j) {
if((ch=getchar()) == '#') // getchar() 为逐个读入标准库函数
T = NULL;
else{
T = new BiTNode; // 产生新的子树
T->data = ch; // 由getchar()逐个读进来
CreatBiTree(T->lchild); // 递归创建左子树
CreatBiTree(T->rchild); // 递归创建右子树
}
}
}
void PreOrderTraverse(BiTNode* &T){ // 先序遍历二叉树
if(T){ // 当节点不为空时执行
cout << T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
else
cout << "";
}
void Inoder(BiTNode* &T){ // 中序遍历二叉树
if(T){
Inoder(T->lchild);
cout << T->data;
Inoder(T->rchild);
}
else
cout << "";
}
void Posoder(BiTNode* &T){ // 中序遍历二叉树
if(T){
Posoder(T->lchild);
Posoder(T->rchild);
cout << T->data;
}
else
cout << "";
}
int main(){
cout << "创建一颗二叉树,其中A~Z字符代表树的数据,用'#'表示空树:" << endl;
BiTNode* T;
CreatBiTree(T);
cout << "先序递归遍历" << endl;
PreOrderTraverse(T);
cout << "中序递归遍历" << endl;
Inoder(T);
cout << "后序递归遍历" << endl;
Posoder(T);
return 1;
}