简单的二叉树的创建和遍历,这算是入门吧。
初版:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef char ElemType;
int heigh = 0;
//二叉链表节点结构的定义
typedef struct BinaryTreeNode{
ElemType Data;
struct BinaryTreeNode *lchild, *rchild;
} BinaryTreeNode, *Binarytree;
//先序遍历方法构建二叉树
BinaryTreeNode *PreCreateTree(Binarytree &node){
char ch;
ch = getchar();
if(ch == '#'){
node = NULL;
}
else{
node = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
node->Data = ch;
cout<<node->Data<<endl;
node->lchild = PreCreateTree(node->lchild);
node->rchild = PreCreateTree(node->rchild);
}
return node;
}
//二叉树中序遍历
void InOrderTransverse(Binarytree node)
{
}
//二叉树先序遍历
void preOrderTransverse(Binarytree node){
if(node == NULL){
return ;
}
cout<<node->Data<<" ";
preOrderTransverse(node->lchild);
preOrderTransverse(node->rchild);
}
int main(){
BinaryTreeNode *tree;
// Init(&node);
PreCreateTree(tree);
preOrderTransverse(tree);
// gethigh(node);
cout<<heigh<<endl;
return 0;
}
// ABEH###C#D##MN###
最终版:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef char ElemType;
int heigh = 0;
//二叉链表节点结构的定义
typedef struct BinaryTreeNode
{
ElemType Data;
struct BinaryTreeNode *lchild, *rchild;
} BinaryTreeNode, *Binarytree;
//先序遍历方法构建二叉树
BinaryTreeNode *PreCreateTree(Binarytree &node) {
char ch;
ch = getchar();
if (ch == '#') {
node = NULL;
}
else
{
node = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
node->Data = ch;
cout << node->Data << endl;
node->lchild = PreCreateTree(node->lchild);
node->rchild = PreCreateTree(node->rchild);
}
return node;
}
//二叉树先序遍历
void preOrderTransverse(Binarytree node) {
if (node == NULL)
return;
else
{
cout << node->Data << " ";
preOrderTransverse(node->lchild);
preOrderTransverse(node->rchild);
}
}
//二叉树中序遍历
void InOrderTransverse(Binarytree node)
{
if (node == NULL)
return;
else
{
InOrderTransverse(node->lchild);
cout << node->Data << " ";
InOrderTransverse(node->rchild);
}
}
//二叉树后序遍历
void PostOrderTransverse(Binarytree node)
{
if (node == NULL)
return;
else
{
PostOrderTransverse(node->lchild);
PostOrderTransverse(node->rchild);
cout << node->Data << " ";
}
}
//计算二叉树的节点总数
int Count(Binarytree node)
{
if (node == NULL)
return 0;
else
{
return Count(node->lchild) + Count(node->rchild) + 1;
}
}
//计算二叉树的高度
int Depth(Binarytree node)
{
int dep1, dep2;
if (node == NULL)
return 0;
else
{
dep1 = Depth(node->lchild);
dep2 = Depth(node->rchild);
return dep1 > dep2 ? (dep1 + 1) : (dep2 + 1);
}
}
//节点左右子树互换
void Exchange(Binarytree node)
{
Binarytree temp;
if (node)
{
temp = node->lchild;
node->lchild = node->rchild;
node->rchild = temp;
Exchange(node->lchild);
Exchange(node->rchild);
}
}
void Delete(Binarytree node)
{
if (node == NULL)
return;
if (node->lchild != NULL)
{
Delete(node->lchild);
}
if (node->rchild != NULL)
{
Delete(node->rchild);
}
delete node;
}
int main() {
BinaryTreeNode *tree;
//构建二叉树
PreCreateTree(tree);
//打印二叉树
cout << "\n打印输入的二叉树:" << endl;
cout << "先序遍历为:" ;
preOrderTransverse(tree);
cout << "\n中序遍历为:" ;
InOrderTransverse(tree);
cout << "\n后序遍历为:" ;
PostOrderTransverse(tree);
cout << endl;
//交换节点的左右子树
Exchange(tree);
cout << "\n交换节点后的二叉树:" <<endl;
cout << "先序遍历为:" ;
preOrderTransverse(tree);
cout << "\n中序遍历为:";
InOrderTransverse(tree);
cout << "\n后序遍历为:";
PostOrderTransverse(tree);
cout << endl;
//计算二叉树的高度和节点总数
int depth=Depth(tree);
int count=Count(tree);
cout << "\n二叉树的高度为:"<< depth << endl;
cout << "二叉树的节点总数为:" << count << endl;
//释放二叉树所有结点占用的系统内存
Delete(tree);
cout << "\n已释放二叉树所有结点占用的系统内存" << endl;
system("pause");
return 0;
}