classSolution { public: intcore(TreeNode* root){ if(!root) return0; int l = core(root->left); int r = core(root->right); returnmax(l, r) + 1; } intdiameterOfBinaryTree(TreeNode* root){ if(!root) return0; int l = diameterOfBinaryTree(root->left); int r = diameterOfBinaryTree(root->right); int m = core(root->left) + core(root->right); returnmax(m, max(l, r)); } };
2.2 一个递归的好方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// 递归主线还是算高度,直径是 [副产品] classSolution { public: int res = 0; intcore(TreeNode* root){ // 给定根节点,计算最长深度节点数 if(!root) return0; int l = core(root->left); // 左儿子为根的子树的深度 int r = core(root->right); // 右儿子为根的子树的深度 res = max(res, l + r); // 在这里更新res,不用+1,因为路径长度是总结点长度-1 returnmax(l, r) + 1; // 返回该节点为根的子树的最长深度节点数 } intdiameterOfBinaryTree(TreeNode* root){ if(!root) return0; core(root); return res; } };