程序代码: #include <iostream> #include <queue> using namespace std; const int N = 10010; const int INF = -1; // 我们用一个常数来表示当前二叉树节点为空的情况 struct Node {
int w; // 当前树节点的值 int p; // 当前树节点的双亲所在数组下标 int l; // 当前树节点的左子节点所在数组下标 int r; // 当前树节点的右子节点所在数组下标 }; Node node[N]; // 按照前序遍历二叉树的顺序输入树节点 void input(int n) {
cin >> node[n].w; if(node[n].w == INF) { // 输入 -1 代表当前节点所在子二叉树停止输入 return ; } node[n].p = n / 2; node[n].l = n * 2; node[n].r = n * 2 + 1; input(n*2); input(n*2+1); } // 前序遍历二叉树 void preOrderParse(int n) {
if(node[n].w == INF) {
return ; } cout << node[n].w << " "; preOrderParse(node[n].l); preOrderParse(node[n].r); } // 中序遍历二叉树 void inOrderParse(int n) {
if(node[n].w == INF) {
return ; } inOrderParse(n*2); cout << node[n].w << " "; inOrderParse(n*2+1); } // 后续遍历二叉树 void postOrderParse(int n) {
if(node[n].w == INF) {
return ; } postOrderParse(n*2); postOrderParse(n*2+1); cout << node[n].w << " "; } void sequenceParse() {
queue<int> que; int n = 1; que.push(1); // 插入根节点所在数组下标 while(!que.empty()) {
n = que.front(); que.pop(); // 得到队头元素并且将队头元素出队列 // 如果当前节点不为空,那么输出该节点,并且将该节点的左右子节点插入队尾 if(node[n].w != INF) {
cout << node[n].w << " "; que.push(node[n].l); que.push(node[n].r); } } } int main() {
cout << "请以前序遍历的顺序输入二叉树,空节点输入 -1 :" << endl; input(1); // 从下标为 1 开始前序输入二叉树 cout << "前序遍历:" << endl; preOrderParse(1); cout << endl << "中序遍历:" << endl; inOrderParse(1); cout << endl << "后序遍历:" << endl; postOrderParse(1); cout << endl << "层序遍历:" << endl; sequenceParse(); return 0; } |