【问题标题】:binary tree with special property具有特殊性质的二叉树
【发布时间】:2011-04-28 15:46:04
【问题描述】:

有一棵二叉树,它的所有内部节点都有val = 'N',所有叶子都有val = 'L'。鉴于其预购。构造树并返回根节点。

每个节点要么有两个孩子,要么没有孩子

【问题讨论】:

  • 你有什么问题?到目前为止,您尝试了什么?
  • 这是您无法解决的问题,还是社区成员的问题?
  • 这个问题并不像人们想象的那样本地化(我假设这是投反对票的原因?)。

标签: algorithm binary-tree


【解决方案1】:

递归是你的朋友。

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
  • @aka:谢谢,你的回答也很好。 +1。拥有递归观点也有助于做其他事情......请参阅我的编辑。
【解决方案2】:

只是基本思想:保留一个堆栈,其中头部是“当前”节点,并按顺序读取表示预排序的字符串。

现在,如果您遇到“L”,则表示“当前”节点作为子节点有一个叶子,因此您可以“切换”到右子节点并继续构建相应的子树,并推动其根子树;如果在遇到“L”时,“当前节点”已经​​有两个子节点,则从堆栈中弹出一个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多