There are two implementation methods. The
first one uses recursion to traverse, taking the maximum depth of the left and right subtrees plus one.
The second implementation method uses a queue for breadth-first traversal. Add one to the depth every time you traverse one layer
// 树的节点
public class TreeNode {
int mValue;
TreeNode mLeftNode;
TreeNode mRightNode;
public TreeNode(int val) {
mValue = val;
}
}
import java.util.LinkedList;
import java.util.Queue;
public class 二叉树的深度 {
// 使用递归进行遍历
private static int treeDepthRecursion(TreeNode root) {
if (root == null) {
return 0; //当没有子节点的时候返回0
}
int leftValue = treeDepthRecursion(root.mLeftNode);
int rightValue = treeDepthRecursion(root.mRightNode);
// 取左右子树的最大深度,然后加1
return Math.max(leftValue, rightValue) + 1;
}
// 非递归进行遍历
// offer add,remove poll,element peek的区别 [https://www.cnblogs.com/chengdabelief/p/6883238.html](https://www.cnblogs.com/chengdabelief/p/6883238.html)
private static int treeDepthNoRecurssion(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root); // 往队列中添加元素
int depth = 0;
while (queue.size() != 0) {
int len = queue.size();
depth++;
// 使用层次遍历的方法,遍历每一层的节点
while (len != 0) {
TreeNode node = queue.poll(); // 返回第一个元素并在队列中删除
if (node.mLeftNode != null) queue.offer(node.mLeftNode);
if (node.mRightNode != null) queue.offer(node.mRightNode);
len--;
}
}
return depth;
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
TreeNode node7 = new TreeNode(7);
root.mLeftNode = node2;
root.mRightNode = node3;
node2.mLeftNode = node4;
node2.mRightNode = node5;
node3.mRightNode = node6;
node5.mLeftNode = node7;
System.out.println(treeDepthRecursion(root));
System.out.println(treeDepthNoRecurssion(root));
}
}```