简单概述一下二叉树:二叉树是一种很有用的非线性结构,非空二叉树只有一个根结点,每一个结点最多有两棵子树,左子树和右子树,它具有如下几个基本性质:
性质1 在二叉树的第K层上,最多有2^(k-1)(k>=1)个结点。
性质2 深度为M的二叉树最多有(2^m)-1个结点。
性质3 在任意一颗二叉树中,度为0的结点(即叶子)总是比度为2的结点多一个。
性质4 具有n个结点的二叉树,其深度至少为[log以2为底的n]+1。
满二叉树:除最后一层外,每一层上的所有结点都有两个子结点。
完全二叉树:除最后一层外,每一层上的结点数均达到最大值;最后一层上只缺少右边的若干结点。
性质5 具有n个结点的完全二叉树的深度[log以2为底的n]+1。
二叉树通常采用链式存储结构,除非是满二叉树或完全二叉树适合用顺序存储。
二叉树链表类
#include<iostream>
using namespace std;
template <class T>
struct Btnode
{
T d;
Btnode *lchild;
Btnode *rchild;
};
template <class T>
class Binary_Tree
{
private:
Btnode<T> * BT;
public:
Binary_Tree(){BT=NULL;return;}
void create_Binary_Tree(T end);//以end值为结束符值,表示没有该结点
void pretrav_Binary_Tree();
void intrav_Binary_Tree();
void postrav_Binary_Tree();
};
template <class T>
void Binary_Tree<T>::create_Binary_Tree(T end)
{
Btnode<T> *p;
T x;
cin>>x; //输入第一个结点值
if(x==end)return; //第一个值为结束符值
p=new Btnode<T>; //申请二叉链表根结点
p->d=x;p->lchild=NULL;p->rchild=NULL;
BT=p; // 二叉树根结点
create(p,1,end); //输入左子结点值
create(p,2,end); //输入右子结点值
return;
}
template <class T>
static create(Btnode<T> *p,int k,T end)
{
Btnode<T> *q;
T x;
cin>>x;
if(x!=end)
{
q=new Btnode<T>;
q->d=x;q->lchild=NULL;q->rchild=NULL;
if(k==1)p->lchild=q; //链接到左子树
if(k==2)p->rchild=q; //链接到右子树
create(q,1,end); //输入左子结点值
create(q,2,end); //输入右子结点值
}
return 0;
}
template <class T>
void Binary_Tree<T>::pretrav_Binary_Tree()
{
Btnode<T> *p;
p=BT;
pretrav(p); //从根结点开始前序遍历
cout<<endl;
return;
}
template<class T>
static pretrav(Btnode<T> *p)
{
if(p!=NULL)
{
cout<<p->d<<" "; //输出根结点值
pretrav(p->lchild); //前序遍历左子树
pretrav(p->rchild); //前序遍历右子树
}
return 0;
}
template <class T>
void Binary_Tree<T>::intrav_Binary_Tree()
{
Btnode<T> *p;
p=BT;
intrav(p);
cout<<endl;
return;
}
template <class T>
static intrav(Btnode<T> *p)
{
if(p!=NULL)
{
intrav(p->lchild);
cout<<p->d<<" ";
intrav(p->rchild);
}
return 0;
}
template <class T>
void Binary_Tree<T>::postrav_Binary_Tree()
{
Btnode<T> *p;
p=BT;
postrav(p);
cout<<endl;
return;
}
template <class T>
static postrav(Btnode<T> *p)
{
if(p!=NULL)
{
postrav(p->lchild);
postrav(p->rchild);
cout<<p->d<<" ";
}
return 0;
}
应用实例
#include "Binary_Tree.h"
int main()
{
Binary_Tree<int> b;
cout<<"输入各结点的值(-1为结束符值):"<<endl;
b.create_Binary_Tree(-1);
cout<<"前序序列:"<<endl;
b.pretrav_Binary_Tree();
cout<<"中序序列:"<<endl;
b.intrav_Binary_Tree();
cout<<"后序序列:"<<endl;
b.postrav_Binary_Tree();
return 0;
}
特别说明:二叉链表的生成输入规则:(1)输入根结点值(2)若左子树不空,则输入左子树,否则输入一个结束符;(3)若右子树不空,则输入右子树,否则输入一个结束符。生成链表的时候会自动判断到什么地方结束。
例如:输入以下数据:18 20 09 -1 -1 25 47 -1 -1 -1 36 -1 12 06 -1 -1 33 -1 -1
实验结果:
(1)
输入各结点的值(-1为结束符值):
20 -1 -1
前序序列:
20
中序序列:
20
后序序列:
20
Press any key to continue
(2)
(3)