在达到 50 名声望之前,我将这个声明放在我的答案的第一行:
我想在评论中做一个简短的回应,但我没有足够的声誉,所以我正在做一个完整的答案,希望我的错误答案仍然会有所帮助。
DFS 非常适合这项任务——这基本上就是前序遍历所做的:
def DFS(node):
if(node == NULL) return
sequence += notNull(node.l)
sequence += notNull(node.r)
DFS(node.l)
DFS(node.r)
^^^ 这就是你的序列的构造方式。
幸运的是,逆向非常简单:
def inverseDFS(node):
if(node == NULL) return
node.l = new Node() if(readBuffer(sequence) == '1') else NULL
node.r = new Node() if(readBuffer(sequence) == '1') else NULL
inverseDFS(node.l)
inverseDFS(node.r)
^^^ 只修改了第 2 行和第 3 行,现在不是通过 child 的存在来确定序列的下一个字符,而是可以根据读取的下一个字符来确定 child 的存在,因为这是一个 iff 关系.
这是一个更复杂的 C++ 代码,是的,我知道我的编码风格可能会让其他人感到厌恶。
/* Author haleyk10198 */
/* FOR ACM-ICPC WF*/
#include <bits/stdc++.h>
using namespace std;
struct Node{
static int nodeCnt;
int id;
Node *l, *r;
Node(){
l = r = nullptr;
this->id = nodeCnt++;
}
friend ostream& operator<<(ostream&, const Node);
}*root = new Node();
ostream& operator<<(ostream &out, const Node node){
cout << "Node id: " << node.id
<< " | left child is " << (node.l? node.l->id: -1)
<< " | right child is " << (node.r? node.r->id: -1) << endl;
}
int Node::nodeCnt, strStreamPos = 0;
string str;
void dfs(Node *node){
if(not node)
return;
if(str[strStreamPos++] == '1')
node->l = new Node();
if(str[strStreamPos++] == '1')
node->r = new Node();
cout << *node << endl;
dfs(node->l);
dfs(node->r);
}
int main(){
cin >> str;
dfs(root);
return 0;
}