二叉树的存储与遍历
const int N = 1e6 + 10;// 二叉树的存储,l数组为左节点,r数组为右结点
int l[N], r[N];
// 存储节点的数据
char w[N];
// 节点的下标指针
int idx = 0;// 先序创建
int pre_create(int n) {cin >> w[n];if (w[n] == '#') return -1;l[n] = pre_create(++idx);r[n] = pre_create(++idx);return n;
}// 中序创建
int in_create(int n) {if (w[n] == '#') return -1;l[n] = in_create(++idx);cin >> w[n];r[n] = in_create(++idx);return n;
}// 后序创建
int back_create(int n) {if (w[n] == '#') return -1;l[n] = back_create(++idx);r[n] = back_create(++idx);cin >> w[n];return n;
}// 先序遍历
void pre_print(int n){if (w[n] != '#') cout << w[n] << ' ';if (l[n] > 0) pre_print(l[n]);if (r[n] > 0) pre_print(r[n]);
}// 中序遍历
void in_print(int n){if (l[n] > 0) in_print(l[n]);if (w[n] != '#') cout << w[n] << ' ';if (r[n] > 0) in_print(r[n]);
}// 后序遍历
void back_print(int n){if (l[n] > 0) back_print(l[n]);if (r[n] > 0) back_print(r[n]);if (w[n] != '#') cout << w[n] << ' ';
}// 层序遍历
void bfs(int root){queue<int> que;que.push(root);while (!que.empty()) {int t = que.front();cout << w[t] << ' ';que.pop();if (l[t] > 0 && w[l[t]] != '#')que.push(l[t]);if (r[t] > 0 && w[r[t]] != '#')que.push(r[t]);}
}
应用
int main(){// 先序创建pre_create(++idx);// 中序创建// in_create(++idx);// 后序创建// back_create(++idx);// 先序遍历pre_print(1);// 中序遍历in_print(1);// 后序遍历back_print(1);// 层序遍历bfs(1);// 测试数据abc##de#g##f###// 输出如下:// a b c d e g f // c b e g d f a // c g e f d b a // a b c d e f g return 0;
}
存起来,一起用