题目
思路
对于每一个结点,我们可以构造一个结构体变量struct node,其中包含数据、左孩子结点、右孩子结点。然后依次存入即可,遍历的话,使用简单的递归遍历即可。
AC代码
#include <bits/stdc++.h>
using namespace std;
/*
1.先用孩子表示法,存储二叉树
2.用递归得结果
*/
const int N = 30;
struct node {
char data;
int lchild, rchild;
} a[N];
void preOrder(int x) {
cout << a[x].data;
if (a[x].lchild != 0)
preOrder(a[x].lchild);
if (a[x].rchild != 0)//不能加else 否则无法深度优先
preOrder(a[x].rchild);
}
/*
对于一个结点,它只会存在四种情况
1.自己就是叶子结点;
2.仅有左子树;
3.仅有右子树;
4.啥都不缺
preOrder对于2或4的情况就一直要搜索下去,对于1的情况,由于前面的递归求解,一定是在靠左边的,就可以输出了,对于3的情况,由于前面的递归,一定是靠左边的,也可以输出了,因为左子树没有的话,这个结点对于右子树就是根了,也符合左 根 右 的原则。
*/
void midOrder(int x) {
if (a[x].lchild)
midOrder(a[x].lchild);
cout << a[x].data;
if (a[x].rchild)
midOrder(a[x].rchild);
}
void lastOrder(int x) {
if (a[x].lchild)
lastOrder(a[x].lchild);
if (a[x].rchild)
lastOrder(a[x].rchild);
cout << a[x].data;
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i].data >> a[i].lchild >> a[i].rchild;
}
//前序遍历
preOrder(1);
//
cout << endl;
midOrder(1);
//
cout << endl;
lastOrder(1);
}