一、本文内容
二叉树的生成,递归遍历以及动态转换为静态数组存储
二、具体代码
1.头部函数及结构体的定义
代码如下(示例):
#include<iostream>
using namespace std;
typedef struct Tree {
char date;
struct Tree* Lchild = NULL, * Rchild = NULL;
}Tree;//定义动态二叉树的结构
typedef struct {
char elem;
int Lc;
int Rc;
}T;//定义静态二叉树的结构,elem 节点名:Lc 左节点的位置:Rc 右节点的位置
2.主要函数
void GreateTree(Tree* & p)//构建动态二叉树
{
Tree* s=p;
char temp=0;
cin >> temp;
if (temp == '#')
p = NULL;
else {
p = new Tree;
p->date = temp;
GreateTree(p->Lchild);
GreateTree(p->Rchild);
}
}
void PrintTree(Tree* p)//按先序遍历输出二叉树
{
if (p != NULL)
{
cout << p->date;
PrintTree(p->Lchild);
PrintTree(p->Rchild);
}
}
int GetNum(Tree* p)//获得二叉树有效节点的个数,方便转换为静态时申请数组的大小
{
if (p != NULL)
return 1+GetNum(p->Lchild) + GetNum(p->Rchild);
else return 0;
}
void StateTree(Tree *p,T s[],int &j)//构建静态二叉树,采用递归的方法。j为当前节点的位置。
{
if (p!=NULL)
{
int t = j;//保留当前节点的位置
s[j].elem = p->date;
if (p->Lchild!=NULL)
{
s[t].Lc = j + 1;
StateTree(p->Lchild, &s[0],++j);//递归寻找下一个节点,++j就是下一个节点的位置
}
else s[t].Lc = -1;
if (p->Rchild!=NULL)
{
s[t].Rc = j + 1;
StateTree(p->Rchild, &s[0], ++j);
}
else s[t].Rc = -1;
}
}
3.主函数
int main()
{
Tree* p = NULL;
int temp = 0;
cout << "请按先序输入二叉树,#表示空" << endl;
GreateTree(p);
cout << "动态二叉树" << endl;
PrintTree(p);
int L = GetNum(p);
cout << endl;
T* s = new T[L];
Tree* t = p;
cout << "静态二叉树" << endl;
StateTree(p, s, temp);
cout << "节点位置" << " " << "节点 " << "左节点 " << "右节点" << endl;
for (int i = 0; i < L; i++)
{
cout <<" "<<i<<" "<< s[i].elem << " ";
if (s[i].Lc == -1)
cout << " # ";
else cout <<" "<< s[i].Lc << " ";
if (s[i].Rc == -1)
cout << " # ";
else cout << " "<<s[i].Rc << " ";
cout << endl;
}
return 0;
}
输出结果
输入的二叉树的图
总结
这里只以二叉树的先序为例子。中序和后序都于此类似。整体而言,二叉树并不难
重点掌握二叉树的递归生成和递归遍历就行。我是新人,初来乍到,希望给我多多关
照,不敢说质量怎么样,但绝对保证是原创。如果有错误的地方还请给位大佬们指点一二。
哈哈哈。大家都加油吧,愿世上再无bug。(*^▽^*)