二叉树的基本操作
以下代码通过先序法创建一个二叉树,然后运用递归思想实现对二叉树的先序、中序、后序的遍历。
#include <iostream>
#include <malloc.h>
using namespace std;
/*
* 二叉树的二叉链表结构的创建与相关操作
* 1.先序法创建二叉树
* 2.先序遍历
* 3.中序遍历
* 4.后序遍历
* 说明:如果结点为叶子结点,只需将左右孩子的值置为'#',(即紧邻之后的两个输入为'#');按照先序方式输入.
* 例如:输入:a b # # c # # ,得到以a为根结点,b为左孩子,c为右孩子的二叉树。
* 输入:a b c # # # d # #,得到(a(b(c,),d))的二叉树
*/
//二叉树结点结构体
typedef struct BTNode
{
char data;
struct BTNode *pLchild, *pRchild;
} BTNode, *BinTree;
//声明函数
void CreatBTree(BinTree &); //创建二叉树
void PreTraverseTree(BinTree); //先序遍历
void InTraverseTree(BinTree); //中序遍历
void PostTraverseTree(BinTree); //后序遍历
void DestoryTree(BinTree); //释放内存
// main函数
int main()
{
BTNode *pBintree = NULL;
CreatBTree(pBintree);
cout << "先序遍历:";
PreTraverseTree(pBintree);
cout << "\n中序遍历:";
InTraverseTree(pBintree);
cout << "\n后序遍历:";
PostTraverseTree(pBintree);
DestoryTree(pBintree);
return 0;
}
//先序建立二叉树
void CreatBTree(BinTree &bt)
{
char val;
cout << "请输入结点值:";
cin >> val;
if (val == '#')
{
return;
}
if (bt == NULL)
{
bt = (BTNode *)malloc(sizeof(BTNode));
bt->data = val;
bt->pLchild = NULL;
bt->pRchild = NULL;
}
CreatBTree(bt->pLchild);
CreatBTree(bt->pRchild);
}
//先序遍历
void PreTraverseTree(BinTree bt)
{
if (bt != NULL)
{
cout << bt->data << "->";
PreTraverseTree(bt->pLchild);
PreTraverseTree(bt->pRchild);
}
else
return;
}
//中序遍历
void InTraverseTree(BinTree bt)
{
if (bt != NULL)
{
InTraverseTree(bt->pLchild);
cout << bt->data << "->";
InTraverseTree(bt->pRchild);
}
else
return;
}
//后序遍历
void PostTraverseTree(BinTree bt)
{
if (bt != NULL)
{
PostTraverseTree(bt->pLchild);
PostTraverseTree(bt->pRchild);
cout << bt->data << "->";
}
else
return;
}
void DestoryTree(BinTree bt)
{
if (bt->pLchild)
{
DestoryTree(bt->pLchild);
bt->pLchild = NULL;
}
if (bt->pRchild)
{
DestoryTree(bt->pRchild);
bt->pRchild = NULL;
}
if (bt->pLchild == NULL && bt->pRchild == NULL)
{
free(bt);
bt = NULL;
}
}