Given the root of a binary tree, return the length of the diameter of the tree.
The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.
The length of a path between two nodes is represented by the number of edges between them.
Example 1:
Input: root = [1,2,3,4,5]
Output: 3
Explanation: 3is the length of the path [4,2,1,3] or [5,2,1,3].
Example 2:
Input: root = [1,2]
Output: 1
Constraints:
The number of nodes in the tree is in the range [1, 104].
-100 <= Node.val <= 100
[풀이 전략]
- 각 루트에서 양쪽의 길이 차를 계산하고 차가 가장 큰 경우를 longest length로 한다.
- 최대 길이를 기억하기 위한 인스턴스 변수 사용.
- 처음엔 길이1 배열을 이용하여 ( int[] maxLen=new int[1]) 재귀로 호출시 배열을 넘겨 기억하는 방법을 사용하였는데, 클린코드 책을 읽고 생각이 바뀌었다. 함수의 인자로 불필요한 인자는 최대한 넘기지 말자.
class Solution {
private int maxLen=0;
public int diameterOfBinaryTree(TreeNode root) {
int sumLen = 2+traversal(root.left) + traversal(root.right);
if (getMaxLen() < sumLen) {
return sumLen;
}
return getMaxLen();
}
public int getMaxLen(){
return this.maxLen;
}
public void setMaxLen(int maxLen){
this.maxLen=maxLen;
}
public int traversal(TreeNode root){
if (root == null) {
return -1;
}
int leftLen=1+traversal(root.left);
int rightLen=1+traversal(root.right);
int sumLen=leftLen + rightLen;
if (getMaxLen() < leftLen + rightLen) {
setMaxLen(sumLen);
}
if (leftLen >= rightLen) {
return leftLen;
}
else{
return rightLen;
}
}
}