打卡!!!每日一题
今天给大家带来一道树类型的深度优先遍历题目。
对于树类型的题目,无论怎么考无非就是考察前中后序遍历以及层次遍历。
当然很多人想当然的认为树的考查只有深度优先遍历(DFS)以及广度优先遍历(BFS),其实这个说法是错误的,因为DFS只是对应二叉树的前序遍历,BFS也只是对应层次遍历而已。
题目描述:543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例:
注意:两结点之间的路径长度是以它们之间边的数目表示。
- 方法1:层次遍历
class Solution {
List<TreeNode> nodeList = new ArrayList<>();
int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
List<Integer> heights = new ArrayList<>();
dfs(root);//将所有结点找到
//依次找每个节点的直径
for (TreeNode node : nodeList) {
int leftSize = getHeight(node.left);
int rightSize = getHeight(node.right);
max = Math.max(leftSize + rightSize, max);
}
return max;
}
public void dfs(TreeNode root) {
if (root == null) {
return;
}
nodeList.add(root);
dfs(root.left);
dfs(root.right);
}
public int getHeight(TreeNode node) {
if (node == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(node);
int height =0;
while (!queue.isEmpty()) {
int size = queue.size();
while (size-- > 0) {
TreeNode t = queue.poll();
if (t.left != null) queue.add(t.left);
if (t.right != null) queue.add(t.right);
}
height++;
}
return height;
}
}
方法2:递归
class Solution {
int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
if (root == null) {
return 0;
}
dfs(root);
return max;
}
private int dfs(TreeNode root) {
if (root.left == null && root.right == null) {
return 0;
}
int leftSize = root.left == null? 0: dfs(root.left) + 1;
int rightSize = root.right == null? 0: dfs(root.right) + 1;
max = Math.max(max, leftSize + rightSize);
return Math.max(leftSize, rightSize);
}
}