1、顺序二叉树的存储结构的定义: typedef struct BiNode{ TElemType data; struct BiNode *lchild,*rchild; //左右孩子指针 }BiNode,*BiTree; 实现: 1.输入字符序列,建立二叉链表; 2.按先根、中根和后根遍历二叉树(递归算法); 3.按某种形式输出整棵二叉树; 4.求二又树的高度; 5.求二叉树的叶节点个数; 6.交换二叉树的左右子树; 7.(选做)借助队列实现二叉树的层次遍历(可以借用队列实现); 8.在主函数中设计一个简单的菜单,分别调试上述算法。 2、需求分析 1)程序功能:建立二叉链表并实现各功能。 2)输入数据:输入字符串。 3)输出数据:中根遍历结果。 4)测试数据:SADW###C##SX#F### 用C++实现
时间: 2024-02-11 09:03:48 浏览: 92
采用字符类型为元素类型和二叉链表为存储结构,实现抽象数据类型二叉树。
很好,你的第一个问题是关于顺序二叉树的存储结构和实现的。以下是C++代码实现:
```cpp
#include <iostream>
#include <queue>
using namespace std;
typedef char TElemType;
typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild; //左右孩子指针
}BiNode,*BiTree;
//创建二叉树
void CreateBiTree(BiTree &T){
char c;
cin>>c;
if(c=='#')
T=NULL;
else{
T = new BiNode;
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序遍历二叉树
void PreOrderTraverse(BiTree T){
if(T){
cout<<T->data<<" ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(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 LevelOrderTraverse(BiTree T){
queue<BiTree> q;
if(T!=NULL){
q.push(T);
}
while(!q.empty()){
BiTree tmp = q.front();
cout<<tmp->data<<" ";
q.pop();
if(tmp->lchild!=NULL){
q.push(tmp->lchild);
}
if(tmp->rchild!=NULL){
q.push(tmp->rchild);
}
}
}
//求二叉树的高度
int GetHeight(BiTree T){
if(T==NULL){
return 0;
}
int leftHeight = GetHeight(T->lchild);
int rightHeight = GetHeight(T->rchild);
return max(leftHeight,rightHeight)+1;
}
//求二叉树的叶节点个数
int GetLeafNum(BiTree T){
if(T==NULL){
return 0;
}
if(T->lchild==NULL && T->rchild==NULL){
return 1;
}
return GetLeafNum(T->lchild)+GetLeafNum(T->rchild);
}
//交换二叉树的左右子树
void Swap(BiTree &T){
if(T==NULL){
return;
}
BiTree tmp = T->lchild;
T->lchild = T->rchild;
T->rchild = tmp;
Swap(T->lchild);
Swap(T->rchild);
}
int main(){
BiTree T = NULL;
cout<<"请输入字符序列,以#代表空节点:"<<endl;
CreateBiTree(T);
cout<<"中序遍历结果为:";
InOrderTraverse(T);
cout<<endl;
cout<<"先序遍历结果为:";
PreOrderTraverse(T);
cout<<endl;
cout<<"后序遍历结果为:";
PostOrderTraverse(T);
cout<<endl;
cout<<"层次遍历结果为:";
LevelOrderTraverse(T);
cout<<endl;
cout<<"二叉树的高度为:"<<GetHeight(T)<<endl;
cout<<"二叉树的叶节点个数为:"<<GetLeafNum(T)<<endl;
Swap(T);
cout<<"交换左右子树后的中序遍历结果为:";
InOrderTraverse(T);
cout<<endl;
return 0;
}
```
在主函数中,我们先使用 `CreateBiTree` 函数创建二叉树,然后依次调用各个函数实现各个功能。
注意,在输出层次遍历结果时,我们使用了一个队列来实现,这是因为层次遍历需要按照层次输出节点,而队列正好可以满足这个需求。
另外,在交换左右子树的函数中,我们使用了递归来实现左右子树的交换。
阅读全文