543-求二叉树直径

假设我们知道对于该节点的左儿子向下遍历经过最多的节点数 L (即以左儿子为根的子树的深度) 和其右儿子向下遍历经过最多的节点数 R (即以右儿子为根的子树的深度),那么以该节点为起点的路径经过节点数的最大值即为 L+R+1

我们记节点 node 为起点的路径经过节点数的最大值为dnode,那么二叉树的直径就是所有节点 dnode的最大值减一。

最后的算法流程为:我们定义一个递归函数 depth(node) 计算 dnode.​ 函数返回该节点为根的子树的深度。先递归调用左儿子和右儿子求得它们为根的子树的深度 L 和 RR,则该节点为根的子树的深度即为max(L,R)+1;该节点的 dnode值​ L+R+1 递归搜索每个节点并设一个全局变量 ans 记录 dnode​ 最大值,最后返回 ans-1 即为树的直径。

链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     int length=0;
13     int diameterOfBinaryTree(TreeNode* root) {
14         depth(root);
15         return length;
16     }
17     int depth(TreeNode* root)
18     {
19         int L=depth(root->left);
20         int R=depth(root-right);
21         length=max(L+R,length);
22         return max(L,R)+1;
23     }
24 };
View Code

猜你喜欢

转载自www.cnblogs.com/nxnslc-blog/p/12459851.html