数组的方式很简单,就是从根节点开始1,2,3依次标号,左节点是 父节点*2,右节点是 父节点*2+1。这种方法的缺点就是需要大量的空间保存数组(包括很多空节点)。例如树共有n层,则需要长度为2^n-1的数组。
还有一种方式就是利用链表的方式,具体实现方法在代码注释里都很清楚。
#include<iostream>
#include<string.h>
using namespace std;
const int MAXN = 500;
struct Node{
int v;
int have_value;
Node *left, *right;
};
char s[MAXN];
Node *root;
int failed;
Node* newNode(){
Node* n = new Node();
if (n != NULL){
n->have_value = 0;
n->left = n->right = NULL;
}
return n;
}
//删除树
void remove_tree(Node* u){
if (u == NULL) return;
remove_tree(u->left);
remove_tree(u->right);
delete(u);
}
//添加节点
void addNode(int n,char *str){
Node* temp = root;
int l = strlen(str);
for (int i = 0; i < l; i++){
if (str[i] == 'L'){
if (temp->left == NULL) temp->left = newNode();
temp = temp->left;
}
if (str[i] == 'R'){
if (temp->right == NULL) temp->right = newNode();
temp = temp->right;
}
}
if (temp->have_value == 1) failed = 1;
temp->v = n;
temp->have_value = 1;
}
//读取
void read_input(){
int v;
//删除roof
root = newNode(); //新建根节点
for (;;){
if (scanf("%s", s) != 1) return; //输入结束
if (!strcmp(s, "()")) break; //读到最后
sscanf(&s[1], "%d", &v); //给v附值
addNode(v, strchr(s,',') + 1); //建立树
}
}
Node* n[MAXN];
int bfs(){ //广度索搜(用队列的储存方式)
int front=0, rear=1;
n[front] = root;
while (front<rear)
{
Node* u = n[front++];
if (!u->have_value) return 0; //先序遍历,先输出父节点
cout << u->v << " ";
if (u->left != NULL) n[rear++] = u->left;
if (u->right != NULL) n[rear++] = u->right;
}
return 1;
}
int main(){ //主函数
failed = 0;
read_input();
bfs();
remove_tree(root);
}