#P4056. 二叉树的直径
题目内容
给你一棵二叉树的根节点,输出该树的直径 。
二叉树的 直径是指树中任意两个节点之间最长路径的 长度。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的长度 由它们之间边数表示。
输入描述
一行包含二叉树的序列化数组,节点值之间用空格隔开,空节点用null表示。
输出描述
输出该二叉树的直径,即最长路径上的边数。
样例1
输入
1 2 3 4 5
输出
3
说明
3 ,取路径[4,2,1,3] 或[5,2,1,3] 的长度。
样例2
输入
1 2
输出
1
提示
树中节点数目在范围 [1, 10^4]内-100 <= Node.val <= 100
核心代码:
int ans=0;
int dfs(TreeNode* root) {
if (root==nullptr) {
return 0;
}
int maxl=dfs(root->left);
int maxr=dfs(root->right);
ans=max(ans,maxl+maxr+1);
return max(maxl,maxr)+1;
}
#include <iostream>
#include <algorithm>
#include<queue>
#include<sstream>
#include <cstring>
#include <stack>
using namespace std;
struct TreeNode {
TreeNode* left;
TreeNode* right;
int val;
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};
//层序遍历构造树
TreeNode * buildTree(vector<string> & order_lever) {
if (order_lever[0]=="null"||order_lever.empty()) {
return nullptr;
}
int i=0;
queue<TreeNode*> q;
TreeNode * root=new TreeNode(stoi(order_lever[i++]));
q.push(root);
while (i<order_lever.size()) {
TreeNode* current=q.front();
q.pop();
if (i<order_lever.size()&&order_lever[i]!="null") {
current->left=new TreeNode(stoi(order_lever[i]));
q.push(current->left);
}
i++;
if (i<order_lever.size()&&order_lever[i]!="null") {
current->right=new TreeNode(stoi(order_lever[i]));
q.push(current->right);
}
i++;
}
return root;
}
int ans=0;
int dfs(TreeNode* root) {
if (root==nullptr) {
return 0;
}
int maxl=dfs(root->left);
int maxr=dfs(root->right);
ans=max(ans,maxl+maxr+1);
return max(maxl,maxr)+1;
}
int main() {
string input,token;
getline(cin,input);
istringstream iss(input);
vector<string> order_lever;
while (iss>>token) {
order_lever.push_back(token);
}
TreeNode* root=buildTree(order_lever);
dfs(root);
cout<<ans-1<<endl;
return 0;
}