二叉树的基本应用

来源:互联网 发布:网络连接图标显示红叉 编辑:程序博客网 时间:2024/04/29 14:27

树的讲解在数据结构中已经占有很大的重要成分啦,二叉树也是树中最基本的一种树,很明显,树有根有叶有枝干,这里只说二叉树,对与二叉树来说就是一个连接点,两个枝干,这里我主要是求二叉树的深度,结点个数,以及遍历的输出。


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 ,我说一下测深度代码的运算过程。

当然我们先有一个二叉树,在输入中我们要能想想出树的样子。

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;
}
}

刚看到这个代码的时候认为有左子树就m加一,右子树就n加一,但是总感觉不是那么合理,我们先来看一下他们的运算过程是怎么样的,先说下树的左边,1的左边是2,2的左边是3,右边是4,3的左边是5,没有右边,4的左边是6,右边是7,7的右边是8,左边没有,可以自己在纸上画出来,根据代码,有左子树就一直运行,一直到5的位置,这是得出m = 0,n= 0,在3的位置得到m = 1,为什么是m,返回的是n,值返回的给了m,当然其他的和这个一样,不是m的值就必须要返回给m的,这个要明白。接下来就好运算啦。


二叉树,有难的地方,大家好好理解,一定要搞懂!祝大家愉快,可能写的不太明白,但是需要自己的理解。



0 0