树的讲解在数据结构中已经占有很大的重要成分啦,二叉树也是树中最基本的一种树,很明显,树有根有叶有枝干,这里只说二叉树,对与二叉树来说就是一个连接点,两个枝干,这里我主要是求二叉树的深度,结点个数,以及遍历的输出。
main.cpp
#include <iostream>
using namespace std;
typedef int ElemType;
#include "BiTree.h"
int main()
{
BiTree T;
CreateBiTree(T);
cout<<"二叉树的深度为:"<<Depth(T)<<endl;
cout<<"二叉树中结点个数为:"<<NodeCount(T)<<endl;
cout<<"二叉树中叶子结点个数为:"<<LeavesNodeCount(T)<<endl;
cout<<"先序遍历:";
PreOrderTraverse(T);
cout<<"\n中序遍历:";
InOrderTraverse(T);
cout<<"\n后序遍历:";
PostOrderTraverse(T);
cout<<endl;
return 0;
}
BiTree.h
#include <iostream>
#include <string>
using namespace std;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)
{
string c;
cin>>c;
char ch;
ch = c[0];
int i = 0;
int n = 0;
if(ch == '#')
{
T = NULL;
}
else
{
while(c[i]!='\0')
{
n =n * 10 + (c[i]-'0');
i++;
}
T = new BiTNode;
T->data = n;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
int Depth(BiTree T)
{
int m,n;
if(T == NULL)
{
return 0;
}
else
{
m = Depth(T->lchild);
n = Depth(T->rchild);
if(m>n)
return m+1;
else
return n+1;
}
}
int NodeCount(BiTree T)
{
if(!T) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int LeavesNodeCount(BiTree T)
{
if(!T) return 0;
else if(!T->lchild&&!T->rchild) return 1;
else return LeavesNodeCount(T->lchild)+LeavesNodeCount(T->rchild);
}
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return ;
else
{
cout<<T->data<<' ';
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return ;
else
{
InOrderTraverse(T->lchild);
cout<<T->data<<' ';
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return ;
else
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data<<' ';
}
}
输出结果:
1 2 3 5 # # # 4 6 # # 7 # 8 # # 9 10 # # 11 12 # # #
二叉树的深度为:5
二叉树中结点个数为:12
二叉树中叶子结点个数为:5
先序遍历:1 2 3 5 4 6 7 8 9 10 11 12
中序遍历:5 3 2 6 4 7 8 1 10 9 12 11
后序遍历:5 3 6 8 7 4 2 10 12 11 9 1
以上是代码,其实代码不长,但是其中有我要写出来的关键之处,那就是在二叉树中的递归用法真是在学二叉树中最难理解的,刚开始的时候,我也没感觉太麻烦,但是对于其中的运算过程我一直搞不懂。其中代码的本质是输入字符的,但是我到后来才发现,就输入了数字,当然在创建函数中的代码是:
void createBiTree(BiTree &T)
{
cin>>ch;
if(ch == '#')
{
T == NULL;
}
else
{
T = new BiTNode ;
T->data = ch;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
以上的代码就是实现输入的字符啦,当然全局变量的int应改为char ,我说一下测深度代码的运算过程。
当然我们先有一个二叉树,在输入中我们要能想想出树的样子。