查找Left-Child Right-Sibling Tree中的第一个元素

时间:2013-11-11 01:39:44

标签: java c++ binary-tree traversal

在最近的一次采访中,我被问到这个问题。 给定一个左子,右兄弟树,找到树中保存真值的第一个节点。 (首先定义为最高级别,答案可以用C ++或Java实现

我的回答如下,我相信它的工作原理是我到目前为止运行的测试用例。我想知道是否有更优雅的解决方案。我现在正在使用3个队列,这似乎不是最佳的。

private class Node{
    Node child;
    Node sibling;
    boolean data;
}

Node findFirstTrue(Node n)
   {
    if (n == null)
    {
        return null;
    }
    if (n.data == true)
    {
        return n;
    }
    Queue<Node> searchNextSibling = new ArrayDeque<Node>();
    Queue<Node> searchNextChildren = new ArrayDeque<Node>();
    searchNextSibling.add(n);
    while(!searchNextSibling.isEmpty() || !searchNextChildren.isEmpty())
    {
        while(!searchNextSibling.isEmpty())
        {
            Node current = (test.Node) searchNextSibling.remove();
            if (current.data == true)
            {
                return current;
            }
            if (current.sibling != null)
            {
                searchNextSibling.add(current.sibling);
            }
            if (current.child != null)
            {
                searchNextChildren.add(current.child);
            }

        }
        Queue<Node> tempQueue = new ArrayDeque<Node>();
        while (!searchNextChildren.isEmpty())
        {
            Node current = (test.Node) searchNextChildren.remove();
            if (current.data == true)
            {
                return current;
            }
            if (current.sibling != null)
            {
                searchNextSibling.add(current.sibling);
            }
            if (current.child != null)
            {
                tempQueue.add(current.child);
            }

        }
        searchNextChildren.addAll(tempQueue);

    }
    return null;
}

1 个答案:

答案 0 :(得分:0)

这是一个用C#编写的更简洁的解决方案,但几乎与java的解决方案相同:

    private Node VisitSiblings(Node node, Queue<Node> q)
{
    if (node == null || node.Flag) return node;
    q.Enqueue(node);                           
    return VisitSiblings(node.Sibling, q);     
}

public Node ReturnFirstTrueNode(Node root)
{
    Queue<Node> q = new Queue<Node>();

    Node node = VisitSiblings(root, q);  
    if (node != null) return node;    
    while (q.Count > 0)
    {
        node = q.Dequeue();
        Node x = VisitSiblings(node.Child, q); 
        if (x != null) return x;  
    }
    return null;  
}