很可能你的問題涉及Łukasiewicz代碼。
給定一個二叉樹,一個Łukasiewicz碼是完整的前序遍歷生成的序列,其中內部節點標記爲a
,外部標記(NULL指針)標記爲b
。 「a /
b」的使用是慣例的問題。你可以使用任何其他符號;比特。
例如,此樹
應與您問題相關的樹
,具有與盧卡西維茨代碼序列如下:
aaabbaababbbaabbabb
考慮繪製與外部節點相同的樹。一些諸如
在該圖中,每個外部節點繪製的水平條。每個外部節點都是一個NULL指針。
現在進行前序遍歷。當您找到外部節點(即空指針)時,您打印NULL
和eol
。當您找到內部節點(與NULL
不同)時,您將輸出密鑰值加上eol
。
您將獲得正是您所提供的序列。
因此,任務是從這種盧卡西維奇遍歷重建原始的樹。這樣的任務可以通過這樣的例程完成:
Node * to_tree(istream & input)
{
string val;
input >> val;
if (val == "NULL")
return nullptr;
Node * p = new Node;
p->get_key() = atoi(val.c_str());
p->left = to_tree(input);
p->right = to_tree(input);
return p;
}
如果序列正確生成,那麼你可以安全地調用這個函數沒有任何風險;它會結束。如果你有興趣驗證輸入,那麼你可以做一個預處理。你初始化一個計數器爲零。每次找到一個密鑰時,您加1,當您找到一個NULL
時,您減1。正確的序列必須以-1結尾。因此,這是因爲n
節點的所有二進制樹具有n + 1
外部節點(或NULL
指針)。最後訪問的節點是外部的,這是唯一的,最後一次計數器達到-1。瞧
./my-program < my-input
等:
你可以自己日常適應你樹的實現,寫一個程序:
int main(int, char **)
{
Node * root = to_tree(cin);
return 0;
}
你編譯它,然後你執行!
我想你需要通過地板上建立自己的樹。 在前兩個分支30和15的末尾;在30以下,有4個NULL和15以下的thera是NULL和20。你下降一層:在4下,有18和NULL(NULL和NULL以下),20以下有19和NULL等。意味着分支末尾沒有任何東西。 –
這不會是一棵二叉樹。 – tekan