You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
1.9 KiB
90 lines
1.9 KiB
package class_2021_11_4_week;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
public class Code01_RetainTree {
|
|
|
|
public static class Node {
|
|
// 值
|
|
public int value;
|
|
// 是否保留
|
|
public boolean retain;
|
|
// 下级节点
|
|
public List<Node> nexts;
|
|
|
|
public Node(int v, boolean r) {
|
|
value = v;
|
|
retain = r;
|
|
nexts = new ArrayList<>();
|
|
}
|
|
}
|
|
|
|
// 给定一棵树的头节点head
|
|
// 请按照题意,保留节点,没有保留的节点删掉
|
|
// 树调整完之后,返回头节点
|
|
public static Node retain(Node x) {
|
|
if (x.nexts.isEmpty()) {
|
|
return x.retain ? x : null;
|
|
}
|
|
// x下层有节点
|
|
List<Node> newNexts = new ArrayList<>();
|
|
for (Node next : x.nexts) {
|
|
Node newNext = retain(next);
|
|
if (newNext != null) {
|
|
newNexts.add(newNext);
|
|
}
|
|
}
|
|
// x.nexts 老的链表,下级节点
|
|
// newNexts 新的链表,只有保留的在里面
|
|
//
|
|
if (!newNexts.isEmpty() || x.retain) {
|
|
x.nexts = newNexts;
|
|
return x;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// 先序打印
|
|
public static void preOrderPrint(Node head) {
|
|
System.out.println(head.value);
|
|
for (Node next : head.nexts) {
|
|
preOrderPrint(next);
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
Node n1 = new Node(1, false);
|
|
Node n2 = new Node(2, true);
|
|
Node n3 = new Node(3, false);
|
|
Node n4 = new Node(4, false);
|
|
Node n5 = new Node(5, false);
|
|
Node n6 = new Node(6, true);
|
|
Node n7 = new Node(7, true);
|
|
Node n8 = new Node(8, false);
|
|
Node n9 = new Node(9, false);
|
|
Node n10 = new Node(10, false);
|
|
Node n11 = new Node(11, false);
|
|
Node n12 = new Node(12, false);
|
|
Node n13 = new Node(13, true);
|
|
|
|
n1.nexts.add(n2);
|
|
n1.nexts.add(n3);
|
|
n2.nexts.add(n4);
|
|
n2.nexts.add(n5);
|
|
n3.nexts.add(n6);
|
|
n3.nexts.add(n7);
|
|
n6.nexts.add(n8);
|
|
n6.nexts.add(n9);
|
|
n6.nexts.add(n10);
|
|
n7.nexts.add(n11);
|
|
n7.nexts.add(n12);
|
|
n9.nexts.add(n13);
|
|
|
|
Node head = retain(n1);
|
|
preOrderPrint(head);
|
|
|
|
}
|
|
|
|
}
|