#include "iostream"
#include "fstream"
#include "stdlib.h"
#include "time.h"
#define random(x)(rand()%x)
#define MaxNode 100
using namespace std;
typedef char DATA;
struct bitree
{
DATA data;
bitree * lchild;
bitree * rchild;
};
int *random_num(int arr_size)
{
srand((unsigned)time(NULL));
int *random_arr=new int[arr_size];
for (int i = 0; i < arr_size; i++)
random_arr[i] = (rand() % 26);
return random_arr;
} //生成随机数
bitree *BUILDBTREE(int b[], int arr_size)
{
bitree *treeNode, *PTR[MaxNode];
int i, j;
PTR[1] = (bitree *)malloc(sizeof(bitree));
PTR[1]->data = b[1];
PTR[1]->lchild = NULL;
PTR[1]->rchild = NULL;
treeNode = PTR[1];
for (i = 2; i <= arr_size; i++)
{
PTR[i] = (bitree *)malloc(sizeof(bitree));
PTR[i]->data = b[i];
PTR[i]->lchild = NULL;
PTR[i]->rchild = NULL;
j = i / 2; /*计算双亲结点的位置j*/
if (i % 2 == 0)
PTR[j]->lchild = PTR[i]; /*BT[i]是双亲的左孩子*/
else
PTR[j]->rchild = PTR[i]; /*BT[i]是双亲的右孩子*/
}
return treeNode;
}
void ShowNodeData(bitree *treeNode)
{
cout << treeNode->data << "\t";
} //直接输出结点数据
void InOrderTraverse(bitree *treeNode)
{
if (treeNode)
{
InOrderTraverse(treeNode->lchild); //显示左子树内容
ShowNodeData(treeNode); //显示结点内容
InOrderTraverse(treeNode->rchild); //显示右子树内容
}
} //中序遍历
void LevelTree(bitree *treeNode)
{
bitree *p;
bitree *q[MaxNode]; //定义一个队列
int head = 0, tail = 0;
if (treeNode) //如果队首指针不为空
{
tail = (tail + 1) % MaxNode; //计算循环队列队尾序号
q[tail] = treeNode; //二叉树根指针进入队列
while (head != tail)
{
head = (head + 1) % MaxNode; //计算循环队列的队首序号
p = q[head]; //获取队首元素
ShowNodeData(p); //输出队首元素
if (p->lchild != NULL) //如果存在左子树
{
tail = (tail + 1) % MaxNode; //计算队列的队尾序号
q[tail] = p->lchild; //左子树入队
}
if (p->rchild != NULL) //如果存在右子树
{
tail = (tail + 1) % MaxNode; //计算队列的队尾序号
q[tail] = p->rchild; //右子树入队
}
}
}
}
int main(void)
{
int *b;
int arr_size;
cout << "输入随机字母的个数:";
cin >> arr_size;
b = random_num(arr_size);
bitree *root = NULL; //root为指向二叉树根结点的指针
root = BUILDBTREE(b,arr_size);
cout << "中序遍历的结果:" << endl;
InOrderTraverse(root);
cout << endl;
delete[]b;
return 0;
}
![](http://imgsrc.baidu.com/forum/w%3D580/sign=1408cb776a061d957d4637304bf40a5d/85cb0a46f21fbe09d66a715b6f600c338744ad4e.jpg)
求问错在哪里?然后怎么改啊?
这个程序的功能就是输入随机数的个数,然后生成二叉树并且遍历,由于中序没写好,所以层序遍历只写了函数
#include "fstream"
#include "stdlib.h"
#include "time.h"
#define random(x)(rand()%x)
#define MaxNode 100
using namespace std;
typedef char DATA;
struct bitree
{
DATA data;
bitree * lchild;
bitree * rchild;
};
int *random_num(int arr_size)
{
srand((unsigned)time(NULL));
int *random_arr=new int[arr_size];
for (int i = 0; i < arr_size; i++)
random_arr[i] = (rand() % 26);
return random_arr;
} //生成随机数
bitree *BUILDBTREE(int b[], int arr_size)
{
bitree *treeNode, *PTR[MaxNode];
int i, j;
PTR[1] = (bitree *)malloc(sizeof(bitree));
PTR[1]->data = b[1];
PTR[1]->lchild = NULL;
PTR[1]->rchild = NULL;
treeNode = PTR[1];
for (i = 2; i <= arr_size; i++)
{
PTR[i] = (bitree *)malloc(sizeof(bitree));
PTR[i]->data = b[i];
PTR[i]->lchild = NULL;
PTR[i]->rchild = NULL;
j = i / 2; /*计算双亲结点的位置j*/
if (i % 2 == 0)
PTR[j]->lchild = PTR[i]; /*BT[i]是双亲的左孩子*/
else
PTR[j]->rchild = PTR[i]; /*BT[i]是双亲的右孩子*/
}
return treeNode;
}
void ShowNodeData(bitree *treeNode)
{
cout << treeNode->data << "\t";
} //直接输出结点数据
void InOrderTraverse(bitree *treeNode)
{
if (treeNode)
{
InOrderTraverse(treeNode->lchild); //显示左子树内容
ShowNodeData(treeNode); //显示结点内容
InOrderTraverse(treeNode->rchild); //显示右子树内容
}
} //中序遍历
void LevelTree(bitree *treeNode)
{
bitree *p;
bitree *q[MaxNode]; //定义一个队列
int head = 0, tail = 0;
if (treeNode) //如果队首指针不为空
{
tail = (tail + 1) % MaxNode; //计算循环队列队尾序号
q[tail] = treeNode; //二叉树根指针进入队列
while (head != tail)
{
head = (head + 1) % MaxNode; //计算循环队列的队首序号
p = q[head]; //获取队首元素
ShowNodeData(p); //输出队首元素
if (p->lchild != NULL) //如果存在左子树
{
tail = (tail + 1) % MaxNode; //计算队列的队尾序号
q[tail] = p->lchild; //左子树入队
}
if (p->rchild != NULL) //如果存在右子树
{
tail = (tail + 1) % MaxNode; //计算队列的队尾序号
q[tail] = p->rchild; //右子树入队
}
}
}
}
int main(void)
{
int *b;
int arr_size;
cout << "输入随机字母的个数:";
cin >> arr_size;
b = random_num(arr_size);
bitree *root = NULL; //root为指向二叉树根结点的指针
root = BUILDBTREE(b,arr_size);
cout << "中序遍历的结果:" << endl;
InOrderTraverse(root);
cout << endl;
delete[]b;
return 0;
}
![](http://imgsrc.baidu.com/forum/w%3D580/sign=1408cb776a061d957d4637304bf40a5d/85cb0a46f21fbe09d66a715b6f600c338744ad4e.jpg)
求问错在哪里?然后怎么改啊?
这个程序的功能就是输入随机数的个数,然后生成二叉树并且遍历,由于中序没写好,所以层序遍历只写了函数
![](http://e.hiphotos.bdimg.com/album/s%3D1200%3Bq%3D90/sign=b76e187bfc039245a5b5e50db7a49fb3/1b4c510fd9f9d72a14f9feabd42a2834359bbbe3.jpg?v=tbs)