加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

返回Java节点中的节点列表父节点可以有多个子节点

发布时间:2020-12-15 02:56:51 所属栏目:Java 来源:网络整理
导读:我正在尝试编写 java代码以返回树中的节点列表. 树看起来像 节点类是 class Node{ String label; ListNode children;} 我正在尝试这种方式.但是无法理解如何编写循环来遍历. public ListNode returnAllNodes(Node node){ ListNode listOfNodes = new ArrayLi
我正在尝试编写 java代码以返回树中的节点列表.
树看起来像

节点类是

class Node{
 String label;
 List<Node> children;
}

我正在尝试这种方式.但是无法理解如何编写循环来遍历.

public List<Node> returnAllNodes(Node node){
    List<Node> listOfNodes = 
        new ArrayList<Node>();
    boolean iterationCompleted = false;
    if(node==null){
        return null;
    }
    while(!iterationCompleted){
    if(node.getChildren()==null){
        listOfNodes.add(node);
                    break;    
    }
            else{
               //
            }
    }
    return null;
    //return traverseAndReturnAllNodes(node.getChildren().get(0));
}

请帮忙.

解决方法

如果您确定结构是树(节点不能有多个父节点),则会按深度优先顺序列出节点:
public static List<Node> returnAllNodes(Node node){
    List<Node> listOfNodes = new ArrayList<Node>();
    addAllNodes(node,listOfNodes);
    return listOfNodes;
}

private static void addAllNodes(Node node,List<Node> listOfNodes) {
    if (node != null) {
        listOfNodes.add(node);
        List<Node> children = node.getChildren();
        if (children != null) {
            for (Node child: children) {
                addAllNodes(child,listOfNodes);
            }
        }
    }
}

如果节点可以有多个父节点,请将addAllNodes的第一行更改为:

if (node != null && !listOfNodes.contains(node)) {

广度优先算法如下:

public static List<Node> returnAllNodes(Node node){
    List<Node> listOfNodes = new ArrayList<Node>();
    if (node != null) {
        listOfNodes.add(node);
        for(int i = 0; i < listOfNodes.size(); ++i) {
            Node n = listOfNodes.get(i);
            List<Node> children = n.getChildren();
            if (children != null) {
                for (Node child: children) {
                    if (!listOfNodes.contains(child)) {
                        listOfNodes.add(child);
                    }
                }
            }
        }
    }
    return listOfNodes;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读