二叉树的相关概念
<二叉树中的每个元素都叫结点>
(1)结点的度。结点所拥有的子树的个数称为该结点的度。例如右图B结点度数为2
(2)叶结点。度为0的结点称为叶结点,或者称为终端结点。例如右图的F,D,C结点
(3)分枝结点。度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点除叶结点外,其余的都是分支结点。例如右图的A,B,E,左图的A,B
(4)结点的层数。规定树的根结点的层数为1,其余结点的层数等于它的双亲结点的层数加1。例如右图的F结点层数为4
(5)树的深度(高度)。树中所有结点的最大层数称为树的深度。例如右图深度为4
(6)树的度。树中各结点度的最大值称为该树的度。一般情况下,二叉树的度都为2
先给出结构
struct BiTree {
char data;
BiTree *lchild,*rchild;
};
二叉树的创建
只能用先序法创建,单独的中序或后序都无法进行创建,原因和解决办法我会在以后博客进行完成
BiTree * Tree :: PreCreateBiTree() {
BiTree *T;
char c;
cin>>c;
if(c=='#') {
T=NULL;
} else {
T=new BiTree;
if(!T) {
cout<<"请求内存失败。"<<endl;
} else {
T->data=c;
}
T->lchild=PreCreateBiTree();
T->rchild=PreCreateBiTree();
}
return T;
}
二叉树深度 左图 3 右图 4
int Tree::HeightOfthis(BiTree *T) {
if(!T) return 0;
else {
return HeightOfthis(T->lchild)>HeightOfthis(T->rchild)?HeightOfthis(T->lchild)+1:HeightOfthis(T->rchild)+1;
}
}
二叉树结点数 左图 4 右图 6
int Tree :: NodeOfthis(BiTree *T) {
if(!T) return 0;
else {
return 1+NodeOfthis(T->lchild)+NodeOfthis(T->rchild);
}
}
二叉树叶子数(即没有分支结点的结点) 左图 2 右图 3
int Tree :: LeafOfthis(BiTree *T) {
if(!T) {
return 0;
} else if( (T->lchild == NULL) && (T->rchild == NULL) ) {
return 1;
} else {
return (BranchOfthis(T->lchild) + BranchOfthis(T->rchild));
}
}
二叉树分枝数 左图 2 右图 3
int Tree :: BranchOfthis(BiTree *T) {
if(!T) {
return 0;
} else if( (T->lchild == NULL) && (T->rchild == NULL) ) {
return 0;
} else {
return (1+ BranchOfthis(T->lchild) + BranchOfthis(T->rchild));
}
}
完整程序
#include <iostream>
#include <string.h>
using namespace std;
struct BiTree {
char data;
BiTree *lchild,*rchild;
};
class Tree {
BiTree *pt;
public :
Tree() {
pt=NULL;
}
BiTree * PreCreateBiTree();
void PreOrderTraverse(BiTree *T);
void InOrderTraverse(BiTree *T);
void LastOrderTraverse(BiTree *T);
int HeightOfthis(BiTree *T);
int NodeOfthis(BiTree *T);
int LeafOfthis(BiTree *T);
int BranchOfthis(BiTree *T);
};
BiTree * Tree :: PreCreateBiTree() {
BiTree *T;
char c;
cin>>c;
if(c=='#') {
T=NULL;
} else {
T=new BiTree;
if(!T) {
cout<<"请求内存失败。"<<endl;
} else {
T->data=c;
}
T->lchild=PreCreateBiTree();
T->rchild=PreCreateBiTree();
}
return T;
}
void Tree::PreOrderTraverse(BiTree *T) {
if(!T) {
return ;
} else {
cout<<T->data<<" ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void Tree::InOrderTraverse(BiTree *T) {
if(!T) {
return ;
} else {
InOrderTraverse(T->lchild);
cout<<T->data<<" ";
InOrderTraverse(T->rchild);
}
}
void Tree::LastOrderTraverse(BiTree *T) {
if(!T) {
return ;
} else {
LastOrderTraverse(T->lchild);
LastOrderTraverse(T->rchild);
cout<<T->data<<" ";
}
}
int Tree::HeightOfthis(BiTree *T) {
if(!T) return 0;
else {
return HeightOfthis(T->lchild)>HeightOfthis(T->rchild)?HeightOfthis(T->lchild)+1:HeightOfthis(T->rchild)+1;
}
}
int Tree :: NodeOfthis(BiTree *T) {
if(!T) return 0;
else {
return 1+NodeOfthis(T->lchild)+NodeOfthis(T->rchild);
}
}
int Tree :: LeafOfthis(BiTree *T) {
if(!T) {
return 0;
} else if( (T->lchild == NULL) && (T->rchild == NULL) ) {
return 1;
} else {
return (LeafOfthis(T->lchild) + LeafOfthis(T->rchild));
}
}
int Tree :: BranchOfthis(BiTree *T) {
if(!T) {
return 0;
} else if( (T->lchild == NULL) && (T->rchild == NULL) ) {
return 0;
} else {
return (1+ BranchOfthis(T->lchild) + BranchOfthis(T->rchild));
}
}
int main() {
Tree tree;
BiTree *biTree;
cout<<"请以先序顺序输入数元素,以'#'代表虚空元素"<<endl;
biTree = tree.PreCreateBiTree();
cout<<"先序遍历结果为: "<<endl;
tree.PreOrderTraverse(biTree);
cout<<endl;
cout<<"中序遍历结果为: "<<endl;
tree.InOrderTraverse(biTree);
cout<<endl;
cout<<"后序遍历结果为: "<<endl;
tree.LastOrderTraverse(biTree);
cout<<endl;
cout<<"高度为:"<<tree.HeightOfthis(biTree)<<endl;
cout<<"节点数为:"<<tree.NodeOfthis(biTree)<<endl;
cout<<"叶子数为:"<<tree.LeafOfthis(biTree)<<endl;
cout<<"分支数为:"<<tree.BranchOfthis(biTree)<<endl;
return 0;
}