经典二叉树
/*
树和二叉树
数据类型:树
存储方式:链式
功能:遍历二叉树
二叉链表和三叉链表区别:二叉只有左右孩子指针,三叉还有一个双亲指针
*/
#include<iostream>
using namespace std;
#define MAX_SIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status; // Status是函数的类型,其值是函数结果状态代码
typedef char TElemType; // 自定义树中存储的数据类型
// 二叉链表
typedef struct BiNode
{
TElemType data;
struct BiNode* lchild, * rchild; // 左右孩子指针
}BiNode,*BiTree;
// 三叉链表
typedef struct TriTNode
{
TElemType data;
struct TriTNode* lchild, * parent, * rchild; // 左右孩子,双亲指针
}TriTNode,*TriTree;
// 利用递归-遍历二叉树
// 先序遍历二叉树
Status PreOrderTraverse(BiTree T)
{
if (T == NULL) return OK; // 空二叉树
else
{
cout << T->data << "\t";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return OK;
}
// 中序遍历二叉树
Status InOrderTraverse(BiTree T)
{
if (T == NULL) return OK;
else
{
PreOrderTraverse(T->lchild);
cout << T->data << "\t"; // 访问根节点
PreOrderTraverse(T->rchild);
}
return OK;
}
// 后序遍历二叉树
Status PostOrderTraverse(BiTree T)
{
if (T == NULL) return OK;
else
{
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
cout << T->data << "\t"; // 访问根节点
}
return OK;
}
// 先序遍历创造二叉树
Status CreateBiTree(BiTree& T)
{
char ch;
cout << "请输入树结点的数据:";
cin >> ch;
if (ch == '#') T = NULL;
else
{
T = new BiNode; // 创造结点
if (!T) exit(OVERFLOW);
T->data = ch; // 生成根节点
CreateBiTree(T->lchild); // 创造左子树
CreateBiTree(T->rchild); // 创造右子树
}
return OK;
}
//复制二叉树
int Copy(BiTree T, BiTree& NewT)
{
if (T == NULL)
{
NewT = NULL;
return 0;
}
else
{
NewT = new BiNode; // 申请新结点
NewT->data = T->data;
Copy(T->lchild, NewT->lchild); // 递归复制左子树
Copy(T->rchild, NewT->rchild); // 递归复制右子树
}
return OK;
}
// 计算二叉树深度
int Depth(BiTree T)
{
if (T == NULL) return 0;
else
{
int m = Depth(T->lchild);
int n = Depth(T->rchild);
if (m > n) return m + 1;
else return n + 1;
}
}
// 计算二叉树结点总数
int NodeCount(BiTree T)
{
if (T == NULL) return 0;
else return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
// 计算二叉树叶子结点数
int LeafCount(BiTree T)
{
if (T == NULL) return 0;
if (T->lchild == NULL && T->rchild == NULL) return 1;
else return LeafCount(T->lchild) + LeafCount(T->rchild);
}
int main()
{
BiTree t;
BiTree Newt;
CreateBiTree(t);
Copy(t,Newt);
cout << "输入的二叉树:" << endl;
PreOrderTraverse(t);
cout << "\n复制的二叉树:" << endl;
PreOrderTraverse(Newt);
cout << "二叉树总结点数:" << NodeCount(t) << endl;;
return 0;
}