/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
private:
int res;
public:
int diameterOfBinaryTree(TreeNode root) {
conth(root);
return res – 1;
}
int conth(TreeNode* root){
if(!root) return 0;
int left = conth(root->left); //返回值为包括了左子树的深度
int right = conth(root->right);
res = max(res, left+right+1); //边数
return (left>right? left:right)+1; //结点深度是个数为基准算的
}
class Solution {
int ans; //全局变量记录长度
public int diameterOfBinaryTree(TreeNode root) {
ans = 1;
depth(root);
return ans-1;
}
public int depth(TreeNode root){
if(root == null){
return 0;
}
// 遍历左子树深度
int L = depth(root.left);
// 遍历右子树深度
int R = depth(root.right);
// 计算经过节点数最大值
ans = Math.max(ans,L+R+1);
// 返回该节点为根的子树深度
return Math.max(L,R)+1;
}
}
”’java
class Solution {
public int diameterOfBinaryTree(TreeNode root) {
//分别求出左子树的长度和右子树的长度
if(root null){
return 0;
}
int left = height(root.left);
int right = height(root.right);
int rootHeight = left + right;
int leftHeight = diameterOfBinaryTree(root.left);
int rightHeight = diameterOfBinaryTree(root.right);
return Math.max(Math.max(rootHeight,leftHeight),Math.max(rootHeight,rightHeight));
}
//求二叉树的长度
public int height(TreeNode root){
int len = 0;
if(root null){
return 0;
}
int leftHeight = height(root.left);
int rightHeight = height(root.right);
return Math.max(leftHeight,rightHeight)+1;
}
//最长路径为左侧的节点数+右侧的节点数
class Solution {
private int result = -1;
public int diameterOfBinaryTree(TreeNode root) {
if(root == null) {
return 0;
}
depth(root);
return result ;
}
private int depth(TreeNode root) {
if (root == null) {
return 0;
}
int left = depth(root.left);
int right = depth(root.right);
result = Math.max(result, left + right);
return Math.max(left, right) + 1;
}
}
function diameterOfBinaryTree(root: TreeNode | null): number {
let max = 0;
const dfs = (node: TreeNode | null) => {
if (!node) return 0;
const left = dfs(node.left);
const right = dfs(node.right);
max = Math.max(max, left + right + 1);
return Math.max(left, right) + 1;
}
dfs(root);
return Math.max(0, max - 1);
};
class Solution {
public:
int ans = 0;
int diameterOfBinaryTree(TreeNode* root) {
dfs(root);
return ans;
}
int dfs(TreeNode* root){
if(root == NULL){
return 0;
}
int left = dfs(root->left);
int right = dfs(root->right);
ans = max(ans, left + right);
return 1 + max(left, right);
}
};
class Solution {
int ans;
int depth(TreeNode* rt){
if (rt == NULL) {
return 0; // 访问到空节点了,返回0
}
int L = depth(rt->left); // 左儿子为根的子树的深度
int R = depth(rt->right); // 右儿子为根的子树的深度
ans = max(ans, L + R + 1); // 计算d_node即L+R+1 并更新ans
return max(L, R) + 1; // 返回该节点为根的子树的深度
}
public:
int diameterOfBinaryTree(TreeNode* root) {
ans = 1;
depth(root);
return ans - 1;
}
};
···java
class Solution {
private int max;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return max;
}
//转换为求二叉树左右子树长度[高度]和的最大值
private int dfs(TreeNode root) {
if(root null){
return 0;
}
int left = dfs(root.left);
int right = dfs(root.right);
// 从当前节点开始计算,不包含当前节点,左子树的最大深度(可以理解成最长的边)加上右子树的最大深度(可以理解成最长的边)
max = Math.max(left + right, max);
// 返回当前节点(包含当前节点在内,所以要加1)左右子树的最高深度
return Math.max(left, right) + 1;
}
class Solution {
int maxLen = 0;
public int diameterOfBinaryTree(TreeNode root) {
if(root == null) return 0;
travel(root);
return maxLen;
}
public int travel(TreeNode root){
if(root == null) return 0;
int left = travel(root.left);
int right = travel(root.right);
maxLen = Math.max(maxLen, left + right);//每个结点的最大直径为 左子树深度 + 右子树深度
return Math.max(left, right) + 1;//以root节点为根节点的树的深度
}
}
class Solution {
int res;
public int diameterOfBinaryTree(TreeNode root) {
res = 1;
depth(root);
return res-1;
}
public int depth(TreeNode root){
if(root==null) return 0;
int left = depth(root.left);
int right = depth(root.right);
res = Math.max(res,left+right+1);
return Math.max(left,right)+1;
}
}
class Solution {
int ans;
public int diameterOfBinaryTree(TreeNode root) {
ans = 1;
depth(root);
return ans-1;
}
public int depth(TreeNode root){
if(root==null){
return 0;
}
int left = depth(root.left);
int right = depth(root.right);
ans = Math.max(ans, left+right+1);
return Math.max(left, right) + 1;
}
}
class Solution {
public:
int BinaryTreePath(TreeNode* root, int& maxPath){
if(root == nullptr){
return 0;
}
int left = BinaryTreePath(root->left, maxPath);
int right = BinaryTreePath(root->right, maxPath);
int sum = left + right;
maxPath = maxPath > sum? maxPath: sum;
return max(left,right)+1;
}
int diameterOfBinaryTree(TreeNode* root) {
int maxPath = INT_MIN;
BinaryTreePath(root, maxPath);
return maxPath;
}
};
class Solution {
int max =0;
public int diameterOfBinaryTree(TreeNode root) {
diameterOfBinaryTree1(root);
return max;// 就是路径长度
}
public int diameterOfBinaryTree1(TreeNode root)
{
//最长直径 左右两边加起来 max
if(root null)
{
return 0;
}
int left=diameterOfBinaryTree1(root.left);
int right=diameterOfBinaryTree1(root.right);
if((left+right)>max)
{
max=(left+right);
}
return Math.max(left,right)+1;
class Solution {
int maxd = 0;
public int diameterOfBinaryTree(TreeNode root) {
depth(root);
return maxd;
}
public int depth(TreeNode node){
if(node == null){
return 0;
}
int left = depth(node.left);
int right = depth(node.right);
maxd = Math.max(maxd, left + right);
return Math.max(left, right) + 1;
}
}
共以下 28 个回答
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
private:
int res;
public:
int diameterOfBinaryTree(TreeNode root) {
conth(root);
return res – 1;
}
};
求出左子树和右子树的最大深度之和 = 二叉树的直径
”’java
class Solution {
public int diameterOfBinaryTree(TreeNode root) {
//分别求出左子树的长度和右子树的长度
if(root null){
return 0;
}
int left = height(root.left);
int right = height(root.right);
int rootHeight = left + right;
int leftHeight = diameterOfBinaryTree(root.left);
int rightHeight = diameterOfBinaryTree(root.right);
return Math.max(Math.max(rootHeight,leftHeight),Math.max(rootHeight,rightHeight));
}
//求二叉树的长度
public int height(TreeNode root){
int len = 0;
if(root null){
return 0;
}
}
时间复杂度O(n)
空间复杂度O(1)
”’
思路:对于一棵树,从根节点到它的左子树的最深经过最多结点个数为左子树的树高+1,到右子树同理是右子树的树高+1,那么经过该根节点最多的节点数为左子树高度+右子树高度+1,所以我们可以深度优先遍历该数得到每个结点作为根结点的子树经过该根节点的最多节点数,然后遍历完成后的最大值即为该树的一个结点到另外结点中的最多节点数,然后将该数减一就得到该树的直径。
时间复杂度:O (n)
空间复杂度:O(1)
C++ 代码递归调用
class Solution {
int maxx=0;
public:
int diameterOfBinaryTree(TreeNode* root) {
{
if(!root->left&&!root->right) return 0;
int l=root->leftNULL?0:maxt(root->left)+1;
int r=root->rightNULL?0:maxt(root->right)+1;
maxx= maxx>l+r?maxx:l+r;
return l>r?l:r;
}
};
递归
左右子树深度之和
思路
就是相当于左右子树的最大深度之和,所以辅助函数就可以直接用一个递归函数来得到每个节点的左右子树的最大高度,得出每个节点的直径。
代码
全部遍历一遍需要O(n) 空间O(1)
···java
class Solution {
private int max;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return max;
}
//转换为求二叉树左右子树长度[高度]和的最大值
private int dfs(TreeNode root) {
if(root null){
return 0;
}
}
“`
在二叉树递归的时候, 有时可以通过后序遍历的方式降低时间复杂度
时间复杂度O(n),空间复杂度O(n)
“`c++
//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {
public:
int ans=0;
int dfs(TreeNode* T)
{
if(T==NULL) return 0;
int l=dfs(T->left),r=dfs(T->right);
ans=max(l+r,ans);
return max(l,r)+1;
}
int diameterOfBinaryTree(TreeNode* root) {
dfs(root);
return ans;
}
};
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度:O(n)
代码
时间 O(n)
空间 O(n)
class Solution {
int max =0;
public int diameterOfBinaryTree(TreeNode root) {
diameterOfBinaryTree1(root);
return max;// 就是路径长度
}
public int diameterOfBinaryTree1(TreeNode root)
{
//最长直径 左右两边加起来 max
if(root null)
{
return 0;
}
int left=diameterOfBinaryTree1(root.left);
int right=diameterOfBinaryTree1(root.right);
if((left+right)>max)
{
max=(left+right);
}
return Math.max(left,right)+1;
7.19
Day12:下面是代码