码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构之二叉树

时间:2018-04-12 00:24:02      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:node   个数   oid   main   应用   using   ace   turn   数据结构   

简述:

二叉树是十分重要的数据结构,主要用来存放数据,并且方便查找等操作,在很多地方有广泛的应用。

二叉树有很多种类,比如线索二叉树,二叉排序树,平衡二叉树等,本文写的是最基础最简单的二叉树。

思路:

二叉树的建立采用的是递归的思想:给定一个指向根节点的指针,然后递归调用ceate()函数,自动生成一个二叉树。就像是在地上挖了个坑(根节点)

,然后他会拿着铲子(create函数)按照一定的规则自动挖一个很大的洞穴(二叉树)出来。当然挖坑前需要先定义每个洞长什么样(定义节点结构)。

二叉树的遍历采用的也是递归的思想:如果节点有数据,则按照遍历规则打印根节点和孩子节点,没有数据则返回直到所有数据都遍历完,递归结束。

 

代码如下:
#include "stdafx.h" //我自己的编译器的问题所以要加
#include<iostream>
using namespace std;
typedef char TElemType;
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree; //*BiTree的意思是给 struct BiTNode*起了个别名,叫BiTree,故BiTree为指向节点的指针。

void createBiTree(BiTree &T) //创建二叉树。
{
char ch;
cin >> ch;
if (‘#‘ == ch)
T = NULL;
else
{
T = new BiTNode;
T->data = ch;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
void PerOrderTraverse(BiTree T) //前序遍历二叉树并打印。
{
if (T)
{
cout << T->data<<" ";
PerOrderTraverse(T->lchild);
PerOrderTraverse(T->rchild);
}
}

void InOrderTraverse(BiTree T) //中序遍历二叉树并打印。
{
if (T)
{
InOrderTraverse(T->lchild);
cout << T->data<<" ";
InOrderTraverse(T->rchild);
}
}

void PostOrderTraverse(BiTree T) //后序遍历二叉树并打印。
{
if (T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data<<" ";
}
}
void Copy(BiTree T, BiTree &NewT) //二叉树的拷贝
{
if (T == NULL)
{
NewT = NULL;
return;
}
else
{
NewT = new BiTNode;
NewT->data = T->data;
cout << NewT->data<<" ";
Copy(T->lchild, NewT->lchild);
Copy(T->rchild, NewT->rchild);

}
}

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; //声明一个指向二叉树根节点的NewT指针,用于复制T的内容
createBiTree(T);
cout << "二叉树创建完毕!" << endl;
cout << "二叉树中结点个数:" << endl;
cout<<NodeCount(T)<<endl;
cout << "二叉树中叶子个数:" << endl;
cout << LeafCount(T) << endl;
cout << "拷贝结果:" << endl;
Copy(T, NewT);
cout << endl;
cout << "前序遍历二叉树:" << endl;
PerOrderTraverse(T);
cout << endl;
cout << "中序遍历二叉树:" << endl;
InOrderTraverse(T);
cout << endl;
cout << "后序遍历二叉树:" << endl;
PostOrderTraverse(T);
cout << endl;
return 0;
}

 

测试样例+结果:

假设我们要建立一个如下图所示的二叉树,#代表空节点,按照前序遍历顺序二叉树表示为:ab##c## (此处为前序)

技术分享图片

下面是代码的运行结果:

技术分享图片

数据结构之二叉树

标签:node   个数   oid   main   应用   using   ace   turn   数据结构   

原文地址:https://www.cnblogs.com/Trojan00/p/8799340.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!