具有特殊属性的二叉树

时间:2011-04-28 15:46:04

标签: algorithm binary-tree

存在具有特殊属性的二叉树,其所有内部节点都具有val ='N'并且所有叶子具有val ='L'。鉴于其预订。构造树并返回根节点。

每个节点可以有两个孩子或没有孩子

2 个答案:

答案 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'时,“当前节点”已经​​有两个子节点,则从堆栈中弹出一个元素。