题干:1130 Infix Expression (25 分)
- 题解:做了45分钟,拿了24分。
- 这题的话一个难点是建树的过程,有的做博主是直接用数组建树的,因为节点的位置和输入的顺序有关联,而且这种方式写出来的短了不少
- 我是前面加了一个把数组转换成链表的过程,其实是我基础知识不扎实。。。因为前面虽然用数组建树,但是实质上用到的是链表的思想内核。。。其实我刚开始想到的也是数组建树,然后我把这个和完全二叉树建树才满足的下标关系混淆了。。。然后就不敢用了
- 这题里面还有一个难点是找树的根节点,这个算法是我原先做最小公共祖先LCA的题目积累的,做法是开一个布尔数组,默认所有节点都是没有祖先,因为题目已经给了树的一个结构信息,我们就可以在建树的过程确认各个节点有无祖先,在建立完成以后,再看看布尔数组里面,哪个节点对应的下标没有被标记,就是树的根节点
- 这题里面最后的一个难点就是中序遍历的应用,递归程序的编写同样通过题目来积累经验,我现在做了这么多归纳一个方法,你通过观察例子总结规律以后,你不要管计算机按照顺序执行如何理解这个规律,你其实只要把这个规律像数学表达式一样写在递归函数中就可以了,因为高级程序设计语言本身就和数学语言很像。。。所以过渡不会太难。。。。
- 这类递归程序有个特点,就是一般不怎么需要调试,和前面需要你自己构建代码逻辑的题目非常不一样。。。。
-
// A1130.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <bits/stdc++.h> using namespace std; struct node { string data; int lc; int rc; node* left; node* right; node() { left = right = NULL; } }; vector<node> an; vector<string> bn; void inorder(node* root) { if (root->left != NULL) { //cout << "("; bn.push_back("("); inorder(root->left); } if (root->left == NULL && root->right != NULL) { //cout << "("; bn.push_back("("); } bn.push_back(root->data); if (root->right != NULL) { inorder(root->right); bn.push_back(")"); //cout << ")"; } if (root->right == NULL && root->left != NULL) { //cout << ")"; bn.push_back(")"); } } int main() { #ifndef ONLINE_JUDGE FILE* s; freopen_s(&s, "in.txt", "r", stdin); #endif // ! int n; cin >> n; an.resize(n + 1); string t1; int t2, t3; for (int i = 1; i <= n; i++) { cin >> t1 >> t2 >> t3; node t; t.data = t1; t.lc = t2; t.rc = t3; an[i]=t; } vector<bool> parent(n + 1, false); for (int i = 1; i <= n; i++) { if (an[i].lc!=-1) { an[i].left = &an[an[i].lc]; parent[an[i].lc] = true; } if (an[i].rc != -1) { an[i].right = &an[an[i].rc]; parent[an[i].rc] = true; } } node* root=NULL; for (int i = 1; i <= n; i++) { if (parent[i] == false) { root = &an[i]; break; } } inorder(root); for (int i = 0; i < bn.size(); i++) { if (i != 0 && i != bn.size() - 1) { cout << bn[i]; } } cout << endl; return 0; }