写一个c++程序,怎么把顺序二叉树转化为二叉链表
时间: 2024-01-17 18:19:01 浏览: 79
C++二叉树(二叉链表实现)
5星 · 资源好评率100%
实现将顺序二叉树转化为二叉链表的C++程序如下:
```c++
#include<iostream>
using namespace std;
#define MaxSize 100
typedef char ElemType;
//二叉树的二叉链表存储表示
typedef struct BiTNode {
ElemType data;//结点数据
struct BiTNode *lchild, *rchild;//左右孩子指针
}BiTNode, *BiTree;
//顺序存储的二叉树结构体
typedef struct SqBiTree {
ElemType data[MaxSize];//存储结点数据的数组
int length;//二叉树的结点数
}SqBiTree;
//将顺序存储的二叉树转化为二叉链表
void CreateBiTree(BiTree &T, ElemType data[], int &i, int length) {
if (i > length) return;//数组越界,递归结束
if (data[i] == '#') {
T = NULL;//结点为空
}
else {
T = new BiTNode;//创建新结点
T->data = data[i];//赋值结点数据
CreateBiTree(T->lchild, data, ++i, length);//递归创建左子树
CreateBiTree(T->rchild, data, ++i, length);//递归创建右子树
}
}
//中序遍历二叉树
void InOrderTraverse(BiTree T) {
if (T) {
InOrderTraverse(T->lchild);//中序遍历左子树
cout << T->data << " ";//访问根结点
InOrderTraverse(T->rchild);//中序遍历右子树
}
}
//将二叉树转化为链表
void BiTreeToList(BiTree T, BiTree &pre) {
if (T) {
BiTreeToList(T->lchild, pre);//递归遍历左子树
T->lchild = pre;//结点的左孩子指向前驱结点
if (pre) pre->rchild = T;//前驱结点的右孩子指向当前结点
pre = T;//更新前驱结点
BiTreeToList(T->rchild, pre);//递归遍历右子树
}
}
int main() {
SqBiTree bt = { {'A','B','C','#','#','D','#','#','E','F'}, 10 };
BiTree T = NULL;
int i = 0;
CreateBiTree(T, bt.data, i, bt.length);//将顺序存储的二叉树转化为链式存储的二叉树
cout << "中序遍历结果为:";
InOrderTraverse(T);//中序遍历二叉树
cout << endl;
BiTree pre = NULL;
BiTreeToList(T, pre);//将二叉树转化为链表
cout << "转化后的双向链表为:";
while (T) {
cout << T->data << " ";
T = T->rchild;
}
cout << endl;
return 0;
}
```
该程序实现了将顺序存储的二叉树转化为链式存储的二叉树,并将其转化为双向链表输出。其中,CreateBiTree函数用于创建二叉树,InOrderTraverse函数用于中序遍历二叉树,BiTreeToList函数用于将二叉树转化为链表。
阅读全文