#include<iostream>
using namespace std;
/*
定义二叉树的数据结构
*/
int MAXSIZE = 100;
typedef struct Node{
char data;
struct Node* lchild;
struct Node* rchild;
}*BitTree,BitNode;
//声明与二叉树相关的操作函数
//1.初始化二叉树
void InitBitTree(BitTree &T);
//2.创建二叉树的操作
void CreateBitTree(BitTree &T);
//3.先序遍历二叉树
void PreOrderBitTree(BitTree &T);
//4.中序遍历二叉树
void InOrderBitTree(BitTree &T);
// 5.后序遍历二叉树
void PostOrderBitTree(BitTree &T);
//6.二叉树的层次遍历
void LevelOrderBitTree(BitTree &T);
//8.返回二叉树的叶子节点的个数
int LeafNum(BitTree &T);
//7.求二叉树的高度
int BitTreeDepth(BitTree &T);
//1.初始化二叉树
void InitBitTree(BitTree &T){
T = NULL;
}
//2.创建二叉树的操作
void CreateBitTree(BitTree &T){
char ch;
cin>>ch;
if(ch=='#') { T = NULL;}
else{
T = (BitTree)malloc(sizeof(BitNode));
if(T==NULL){
exit(-1);
}
T->data = ch;
CreateBitTree(T->lchild);
CreateBitTree(T->rchild);
}
}
//3.先序遍历二叉树,采用非递归的方式遍历二叉树
void PreOrderBitTree(BitTree &T){
BitTree stack[MAXSIZE];
int top = 0;
BitTree p = T;
while(p!=NULL||top>0){
while(p!=NULL){
cout<<p->data<<" ";
stack[top++] = p;
p=p->lchild;
}
if(top>0){
p = stack[--top];
p = p->rchild;
}
}
cout<<endl;
}
//4.中序遍历二叉树,采用非递归的方式遍历二叉树
void InOrderBitTree(BitTree &T){
BitTree stack[MAXSIZE];
int top = 0;
BitTree p = T;
while(p!=NULL||top>0){
while(p!=NULL){
stack[top++] = p;
p=p->lchild;
}
if(top>0){
p = stack[--top];
cout<<p->data<<" ";
p = p->rchild;
}
}
cout<<endl;
}
// 后序遍历二叉树,采用非递归的方式遍历二叉树
void PostOrderBitTree(BitTree &T){
BitTree stack[MAXSIZE];
int top = 0;
BitTree p = T;
BitTree q = NULL;
while(p!=NULL||top>0){
while(p!=NULL){
stack[top++] = p;
p=p->lchild;
}
if(top>0){
p = stack[top-1];
if(p->rchild == NULL||p->rchild == q){
cout<<p->data<<" ";
top--;
q=p;
p=NULL;
}else{
p = p->rchild;
}
}
}
cout<<endl;
}
//6.二叉树的层次遍历
void LevelOrderBitTree(BitTree &T){
BitTree Queue[MAXSIZE];
int front = -1;
int rear = -1;
rear++;
Queue[rear] = T;
BitTree p = NULL;
while(front!=rear){
front = (front+1)%MAXSIZE;
p = Queue[front];
cout<<p->data<<" ";
if(p->lchild!=NULL){
rear = (rear+1)%MAXSIZE;
Queue[rear] = p->lchild;
}
if(p->rchild!=NULL){
rear = (rear+1)%MAXSIZE;
Queue[rear] = p->rchild;
}
}
cout<<endl;
}
//8.返回二叉树的叶子节点的个数
int LeafNum(BitTree &T){
if(!T) return 0;
if(!(T->lchild)&&!(T->rchild))
return 1;
else
return LeafNum(T->lchild)+LeafNum(T->rchild);
}
//7.求二叉树的高度
int BitTreeDepth(BitTree &T){
if(!T) return 0;
int lh = BitTreeDepth(T->lchild);
int rh = BitTreeDepth(T->rchild);
return lh>rh?1+lh:1+rh;
}
int main(){
BitTree T;
cout<<"创建一个二叉树:"<<endl;
CreateBitTree(T);
cout<<"线序遍历二叉树:"<<endl;
PreOrderBitTree(T);
cout<<"中序遍历二叉树:"<<endl;
InOrderBitTree(T);
cout<<"后序遍历二叉树:"<<endl;
PostOrderBitTree(T);
cout<<"按层次遍历二叉树:"<<endl;
LevelOrderBitTree(T);
cout<<"输出二叉树的叶子节点个数:"<<endl;
cout<<LeafNum(T)<<endl;
cout<<"输出二叉树的高度:"<<endl;
cout<<BitTreeDepth(T)<<endl;
system("pause");
return 0;
}
分享到:
相关推荐
二叉树基本操作的程序实现,可以完成基本的操作
【实验课程名称】算法与数据结构 【实验项目名称】二叉树基本操作的实现
二叉树基本操作 数据结构 实验报告
1、根据输入的数据建立一个二叉树; 2、分别采用前序、中序、后序的遍历方式显示输出二叉树的遍历结果 3、采用非递归的编程方法,分别统计二叉树的节点个数、度为1、度为2和叶子节点的个数,以及数据值的最大值和...
创建,输出左右结点,求深度,宽度,求叶子结点及总结点的个数,查找结点,求某结点的子孙个数,输出二叉树
C++二叉树基本操作
1. 熟悉二叉树结点的结构和对二叉树的基本操作。 2. 掌握对二叉树每一种操作的具体实现。...4. 在二叉树基本操作的基础上掌握对二叉树的一些其它操作的具体实现方法。 5. 掌握构造哈夫曼树以及哈夫曼编码的方法
数据结构实用教程之二叉树,其中包含了:二叉树的定义、二叉树的递归遍历、二叉树基本操作。 数据结构实用教程之二叉树,其中包含了:二叉树的定义、二叉树的递归遍历、二叉树基本操作。 数据结构实用教程之二叉树,...
数据结构试验:二叉树基本操作 二叉树的各种遍历及求二叉树深度
此系统设计整合了二叉树基本操作,二叉树排序,二叉树计算和文件读写四个功能。
运用二叉链表实现二叉树的基本操作,包括:创建二叉树的存储结构、复制已有的二叉树、计算已有的二叉树的深度、先根序序列、中根序序列、后根序序列等。 输入格式:AB#C##D## 二、实验目的 掌握二叉链表及二叉树的...
二叉树 二叉树_基于C语言实现的二叉树基本操作
二叉树基本操作的实现,含实验报告,基本操作: 1 前、中、(非递归)后序遍历 2求二叉树的深度、结点数和叶子数 3交换二叉树的左右子树并前、中序遍历 4 将二叉树扩充为中序线索树,并(非递归)中序遍历 5。。。。...
题目:二叉树基本操作设计及实现 总体设计:设计单向链表实现对二叉树的查询和插入操作; 要求: (1)设计单向链表,实现二叉树的生成。 (2)实现对二叉树的遍历查询; (3)实现对二叉树叶节点的增加;
二叉树基本操作示例.cpp
实现了二叉树的前向生成以及前向遍历。属于二叉树的基本操作。
二叉树的基本操作的各种操作 先序 中序 后序 遍历二叉树 还有二叉树的节点数的求法