私は私の答えの1行目にこのdeclaimerを入れています50評判到達する前に:
を私が代わりにコメントで簡単な応答をしたいが、私は十分な評判を持っていないので、私は完全な答えを作って、うまくいけば私の邪悪な答えはまだ助けになるでしょう。
DFSは、このタスクのために完全である - それはプリオーダートラバーサルが何をしているのか、基本的です:
def DFS(node):
if(node == NULL) return
sequence += notNull(node.l)
sequence += notNull(node.r)
DFS(node.l)
DFS(node.r)
^^^これはあなたの順序を構築する方法です。
は幸い逆は非常に単純です:代わりに子供のexistanceによって、シーケンスの次の文字を決定する
が
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に変更され、今、私たちが判断することができますこれは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;
}
「1つのノードでx1とx2の両方を検討する」とはどういう意味ですか?すべてのツリーには、複数の子を持つことができるノードを持つことができます。それ以外の場合はリンクリストになります:)これとリンクした質問の違いは何ですか? –
この質問では、親の下に子供を置く場所(左右どちらか)も考慮する必要がありますが、リンクされた質問ではその権利を考慮する必要はありませんか? –