题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805365537882112
bool数组赋值问题:https://blog.csdn.net/SmartLoveyu/article/details/100121485?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
注意点
- 这题主要是使用了静态链表
- 代码写完找了半天bug,结果发现是isRoot数组的初始赋值问题,默认是赋false值的;下次直接赋值使用vector吧,或者赋false值
- 另一个需要记住的是反转链表是后序遍历,先递归两个子再将它们反转。
- 感觉今天对先序中序后序层序遍历已经有了一个基本的了解了
代码
#include<algorithm>#include<iostream>#include<queue>#include<cstdio>#include<cstring>using namespace std;const int maxn = 110;struct Node{int lchild, rchild;}node[maxn];int n;vector<bool> isRoot(maxn, true);int strToNum(char c){if(c == '-') return -1;else {isRoot[c - '0'] = false;return c - '0';}}int find_root(){for(int i = 0; i < n; i++){if(isRoot[i] == true){return i;}}}void invert(int root){if(root == -1) return;invert(node[root].lchild);invert(node[root].rchild);swap(node[root].lchild, node[root].rchild);}void level(int root){int count = 0;queue<int> q;q.push(root);while(!q.empty()){int top = q.front();q.pop();if (count != 0) printf(" ");printf("%d",top);count++;if(node[top].lchild != -1) q.push(node[top].lchild);if(node[top].rchild != -1) q.push(node[top].rchild);}}int count_of_in = 0;void inOrder(int root){if(root == -1) return;inOrder(node[root].lchild);if(count_of_in != 0) printf(" ");printf("%d",root);count_of_in++;inOrder(node[root].rchild);}int main(){char lchild, rchild;scanf("%d",&n);for(int i = 0; i < n; i++){//scanf("%c%c", &lchild, &rchild);cin>>lchild>>rchild;node[i].lchild = strToNum(lchild);node[i].rchild = strToNum(rchild);}int root = find_root();invert(root);level(root);cout<<endl;inOrder(root);return 0;}
