存在具有特殊属性的二叉树,其所有内部节点都具有val ='N'并且所有叶子具有val ='L'。鉴于其预订。构造树并返回根节点。
每个节点可以有两个孩子或没有孩子
答案 0 :(得分:5)
递归是你的朋友。
Tree TreeFromPreOrder(Stream t) {
switch (t.GetNext()) {
case Leaf: return new LeafNode;
case InternalNode:
Node n = new Node;
n.Left = TreeFromPreOrder(t);
n.Right = TreeFromPreOrder(t);
return n;
default:
throw BadPreOrderException;
}
}
将其视为一种递归方法,很容易看出其他事情。
例如,假设我们想要打印InOrder遍历。代码看起来像这样:
void PrintInorderFromPreOrder(Stream t) {
Node n = new Node(t.GetNext());
switch (n.Type) {
case Leaf: return;
case InternalNode:
PrintInorderFromPreOrder(t);
print(n.Value);
PrintInorderFromPreOrder(t);
default:
throw BadPreOrderException;
}
}
另外,我想提一下,这不是人为的。当我们需要序列化二叉树时,这种类型的表示实际上可用于节省空间:Efficient Array Storage for Binary Tree。
答案 1 :(得分:1)
基本思路:保持一个堆栈,其中头部是“当前”节点,并按顺序读取代表预订的字符串。
现在,如果你遇到一个'L',那么它意味着“当前”节点作为一个孩子的叶子,所以你可以“切换”到正确的孩子并恢复构建相应的子树,推动其根子树;如果,当遇到'L'时,“当前节点”已经有两个子节点,则从堆栈中弹出一个元素。