赞
踩
对于每一个结点,我们可以构造一个结构体变量struct node,其中包含数据、左孩子结点、右孩子结点。然后依次存入即可,遍历的话,使用简单的递归遍历即可。
#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); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。