具有特殊属性的二叉树

kc3*_*kc3 1 algorithm binary-tree

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

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

小智 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

将它看作一种递归方法,很容易看出其他的事情.

例如,假设我们想要打印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;
    }
}
Run Code Online (Sandbox Code Playgroud)



另外,我想提一下,这不是人为的.当我们需要序列化二叉树时,这种类型的表示实际上可以用来节省空间:二进制树的高效数组存储.