如何遍历一棵树中,每一层的最右边的节点?

荆州拉人去编程 2020-12-01 02:09:40
给一颗树,不是二叉树,实现方式随便。如何遍历每一层最右边的节点?我现在能想到的如下:

思路:

用list维护这颗树;
parentNode = root节点;
beginFlag = false;
从头到尾遍历:
该节点的parent==parentNode?
如果相等,则让beginFlag = true;
如果不等,且beginFlag == true,则表名该节点的前一个节点是最右边的节点。打印该节点,然后parentNode = 该节点。beginFlag = false;


实现:

public class Tree<T> {
private final List<Node> tree = new ArrayList<>();

private class Node {
private Node parent;
private T value;

private Node(Node parent, T value) {
this.parent = parent;
this.value = value;
}

public Node getParent() {
return parent;
}

public T getValue() {
return value;
}
}

public void addNode(int parentIndex, T value) {
//传入-1代表添加根节点
if (parentIndex == -1) {
tree.add(new Node(null, value));
} else {
tree.add(new Node(tree.get(parentIndex), value));
}
}

public int getParentIndex(int index) {
return tree.indexOf(tree.get(index).parent);
}

public int size() {
return tree.size();
}

public T getNodeValue(int index) {
return tree.get(index).value;
}

public static void main(String[] args) {
Tree<Integer> treeTest = new Tree<>();

//root
treeTest.addNode(-1, 0);

//第二层
treeTest.addNode(0, 1);
treeTest.addNode(0, 2);
treeTest.addNode(0, 3);

//第三层
treeTest.addNode(1, 4);
treeTest.addNode(2, 5);
treeTest.addNode(2, 6);
treeTest.addNode(3, 7);
treeTest.addNode(3, 8);
treeTest.addNode(3, 9);

//第四层
treeTest.addNode(6, 10);

int parentIndex = -1;
boolean beginFlag = false;
for (int i = 0; i < treeTest.size(); i++) {
if (treeTest.getParentIndex(i) == parentIndex) {
beginFlag = true;
} else {
if (beginFlag) {
System.out.println(treeTest.getNodeValue(i - 1));
parentIndex = i - 1;
beginFlag = false;
}
}
//如果是最后一个节点,则直接打印
if (i == treeTest.size() - 1) {
System.out.println(treeTest.getNodeValue(i));
break;
}
}
}
}


但该方法的时间复杂度是O(n),我想知道有没有更好的方式?
...全文
176 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧