一、问题
1
2 3
4 5 6
7
输出该树的层数
二、代码
Java
两种方法
@Data
public class Node {
private Integer id;
private Node left;
private Node right;
public Node(Integer id) {
this.id = id;
}
public Node(Integer id, Node left, Node right) {
this.id = id;
this.left = left;
this.right = right;
}
}
@Data
public class Tree {
private Node root;
/**
* 建树 【V80】
*
* 1
* 2 3
* 4 5 6
* 7
*/
public void build() {
Node node7 = new Node(7);
Node node6 = new Node(6);
Node node5 = new Node(5, node7, null);
Node node4 = new Node(4);
Node node3 = new Node(3, node5, node6);
Node node2 = new Node(2, null, node4);
root = new Node(1, node2, node3);
}
/**
* 求树的层数
*/
public int getLevel(Node root) {
if (root == null) {
return 0;
}
int level = 1;
Node levelFirstNode = root; //每层的第一个节点
boolean canLevelPlus = false; //level是否能+1
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node head = queue.poll();
//已经拿到level层的第一个节点,只要该层有节点存在左孩子或右孩子,level就+1
if (Objects.equals(head.getId(), levelFirstNode.getId())) {
canLevelPlus = true;
}
if (head.getLeft() != null) {
queue.offer(head.getLeft());
if (canLevelPlus) {
level ++;
levelFirstNode = head.getLeft();
canLevelPlus = false;
}
}
if (head.getRight() != null) {
queue.offer(head.getRight());
if (canLevelPlus) {
level ++;
levelFirstNode = head.getRight();
canLevelPlus = false;
}
}
}
return level;
}
/**
* 求树的层数
*/
public int getLevel2(Node root) {
if (root == null) {
return 0;
}
int level = 0;
Node nextLevelFirstNode = root; //level下一层的第一个节点
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node head = queue.poll();
//到下一层的第一个节点了,level才+1
if (nextLevelFirstNode != null && Objects.equals(head.getId(), nextLevelFirstNode.getId())) {
level ++;
nextLevelFirstNode = null;
}
if (head.getLeft() != null) {
queue.offer(head.getLeft());
if (nextLevelFirstNode == null) {
nextLevelFirstNode = head.getLeft();
}
}
if (head.getRight() != null) {
queue.offer(head.getRight());
if (nextLevelFirstNode == null) {
nextLevelFirstNode = head.getRight();
}
}
}
return level;
}
public static void main(String[] args) {
Tree tree = new Tree();
tree.build();
System.out.println(tree.getLevel(tree.getRoot()));
System.out.println(tree.getLevel2(tree.getRoot()));
}
}
运行结果
4
4
三、扩展
扩展