543. Diameter of Binary 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.

idea:

For every node, length of longest path which pass it = MaxDepth of its left subtree + MaxDepth of its right subtree.

้‡้ปžๆ˜ฏ every node, ๆ‰€ไปฅ่ทŸ 104 ไธๅคงไธ€ๆจฃ็š„้ปžๆ˜ฏ, 104 ไนŸๆ˜ฏๆฑ‚ๆœ€ๅคงๆทฑๅบฆ, ไฝ†้€™ๆ˜ฏๆ•ดๅ€‹็š„ๆœ€ๅคงๆทฑๅบฆ, ่€Œ้€™้กŒๆ˜ฏ่ฆๆœ€้•ท็š„ๅทฆๆทฑๅบฆ + ๅณๆทฑๅบฆ, ๆ‰€ไปฅๅœจ้‹็ฎ—้Ž็จ‹ไธญ, ่ฆ่จ˜้Œ„ๆœ€ๅคง็š„ left + right, ไนŸๅฐฑๆ˜ฏๅฏ่ƒฝไธๆœƒ็ถ“้Ž root, ๅฐฑๆœ‰ๆœ€ๅคงdiameterไบ†

104 ้‚ฃ็จฎๆ•ดๅ€‹่ท‘ๅฎŒ, ๆฑ‚ๅพ—ๆ•ดๅ€‹ๆจน็š„ๆทฑๅบฆ, ไธ€ๅฎšๆœ‰็ถ“้Ž root

res = Math.max(res, left + right); // ๆ‰€ไปฅๅ…ถๅฏฆๅคš้€™่กŒ็ˆพไปฅ, ๅคšไธ€ๅ€‹ global variable: res

can refer:

https://ithelp.ithome.com.tw/articles/10227129

time: O(n)

space: O(n)

class Solution {
    int res = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        maxLength(root);
        return res;
    }
    private int maxLength(TreeNode root) {
        if (root == null) return 0;
        int left = maxLength(root.left);
        int right = maxLength(root.right);
        
        res = Math.max(res, left + right); // maybe not walk through root, so record here again
        
        return Math.max(left, right) + 1; // walk through root
    }
}

new ver

naive, we can do bfs on each node: O(n^2)

right ver, dfs

T: O(n)

S: O(h), worst O(n)

class Solution {
    int numOfNodes = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        dfs(root);
        return numOfNodes-1; // len is num of nodes - 1
    }
    private int dfs(TreeNode node) {
        if (node == null) {
            return 0;
        }
        int left = dfs(node.left);
        int right = dfs(node.right);
        
        // res = left side node num + right side node num + node itself 
        numOfNodes = Math.max(numOfNodes, left+right+1); 
        
        // one side's longer length(node num) + node itself
        return Math.max(left, right)+1; 
    }
}

without global variable

```java
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 
length of the diameter of the tree = max (left depth + right depth)

 */
class Solution {
    public int diameterOfBinaryTree(TreeNode root) {
        int[] result = new int[1];
        dfs(root, result);
        return result[0];
    }
    private int dfs(TreeNode node, int[] result) {
        if (node == null) {
            return 0;
        }
        int left = dfs(node.left, result);
        int right = dfs(node.right, result);
        result[0] = Math.max(result[0], left + right);

        return Math.max(left, right) + 1;
    }
}
```

Last updated