【问题标题】:Adding children recursively to tree structure (children before parent)将子递归添加到树结构(父级之前的子级)
【发布时间】:2021-06-23 08:38:13
【问题描述】:

我正在做一个实习任务,他们给了我一个任务来创建一个导航菜单,如下面的这个:

. Company
.... About Us
....... Team
.... Mission
. References
.... Client 1
.... Client 2

任务的重点是我要找到一种方法将这个输入转换为树结构,然后递归打印出来...... 输入是:

ID NAME PARENTID
1; Company; NULL;
2; About Us; 1;
3; Mission; 1;
4; Team; 2;
5; Client1; 7;
6; Client2; 7;
7; References; NULL;

如果这是第一个父子类型的输入,那么任务将非常简单,但是我被卡住了,似乎无法理解其背后的算法。整个交易是在最后添加引用,但客户端 1 和客户端 2 都是引用的子项...

代码如下:

模型类:

// WITH SETTERS AND GETTERS
public class NavLink
{
    private String id;
    private String name;
    private String parentId;
    private String isHidden;
    private String linkUrl;
}

三重链表节点类:

public class TLLNode<NavLink>
{
    public NavLink element;
    public TLLNode<NavLink> parent, sibling, child;

    public TLLNode(NavLink elem)
    {
        this.element = elem;
        parent = sibling = child = null;
    }
}

树类:

public class Tree
{
    private TLLNode<NavLink> root;

    public Tree(NavLink element) { this.root = new TLLNode(element); }

    public TLLNode<NavLink> getRoot() { return this.root; }

    public void addChild(TLLNode<NavLink> node, NavLink element)
    {
        TLLNode<NavLink> insert =  new TLLNode<>(element);

       if (node.child == null)
            node.child = insert;

       else
       {
            if (node.child.element.getName().compareTo(insert.element.getName()) > 0)
                    insert.sibling = node.child;
            else
            {
                TLLNode<NavLink> tmp = node.child;
                while (tmp.sibling != null)
                {
                    if (tmp.sibling.element.getName().compareTo(insert.element.getName()) > 0)
                    {
                        insert.sibling = tmp.sibling;
                        break;
                    }
                    tmp = tmp.sibling;
                }
                tmp.sibling = insert;
            }
        }
        insert.parent = node;
    }

    public void printTree() { printTreeRecursive(this.root, 0); }

    private void printTreeRecursive(TLLNode<NavLink> node, int level)
    {
        if (node == null)
            return;

        for (int i=0; i < level-1; i++)
            System.out.print("...");

        if (node.element.getHidden().equalsIgnoreCase("False"))
            System.out.println("." + node.element.getName());

        TLLNode<NavLink> tmp = node.child;
        while (tmp != null)
        {
            printTreeRecursive(tmp, level+1);
            tmp = tmp.sibling;
        }
    }
}

最后是问题所在的 Main 类:

public class Main
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        String[] parts;
        List<NavLink> list = new LinkedList<>();

        NavLink link = new NavLink("NULL", "/", "/", "True", "/" );
        Tree tree = new Tree(link);

        for (int i=0; i<n; i++)
        {
            parts = br.readLine().split(";");
            link = new NavLink(parts[0], parts[1], parts[2], parts[3], parts[4]);

            list.add(link);
        }

        /*TLLNode<NavLink> current;
        for (NavLink item : links)
        {
            current = new TLLNode<>(item);
            System.out.println(item);
            for (NavLink tmp : links.subList(1, links.size()))
            {
                if (tmp.getParentId().equalsIgnoreCase(current.element.getId()))
                    tree.addChild(current, tmp);
            }
        }*/

        addChildRecursive(tree, list, tree.getRoot());
        tree.printTree();
    }

    public static void addChildRecursive(Tree tree, List<NavLink> list, TLLNode<NavLink> current)
    {
        if (current == null)
            return;

        TLLNode<NavLink> insert;
        for (NavLink item : list)
        {
            insert = new TLLNode<>(item);
            if (insert.element.getParentId() == current.element.getId())
            {
                tree.addChild(current, insert.element);
                list.remove(insert.element);
                addChildRecursive(tree, list, current.child);
            }
        }
    }
}

addChildRecursive 方法是给我带来问题的方法,在输出中它没有说有任何错误。

我不明白这里需要做什么?

附:忽略isHidden等属性,主要问题出在addChildRecursive方法

【问题讨论】:

    标签: java recursion tree


    【解决方案1】:

    首先,在 java 中,建议您使用 now equals() 函数而不是 == 运算符检查两个字符串是否相等。 现在对于您的问题,您似乎只检查了当前节点的子节点,并且因为可能有多个子节点,所以您不会全部检查它们。 我建议使用孩子列表或其他某种机制来直接保存所有孩子,而不是通过“兄弟”指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多