很可能你的问题涉及Ł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