最长同值路径
题目描述
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
实例1:
输入:
输出 : 2
输入:
输出 : 2
题解:
看到二叉树的题,首先要想到递归。首先,要想得到等值路径,需要该节点的左孩子的等值路径和该节点右孩子的等值路径。若该节点的值和左右孩子的值相同的话,那么把左右子树等值路径相加,然后比较这次的等值路径和当前最大等值路径的大小,若比当前最大等值路径大,则更新。
/**
*
* Definition for a binary tree node. *
* struct TreeNode
*{
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* }; */
* class Solution {
* public:
* int max_path=0;
* int path(TreeNode* t,int val)// 返回t的左子树和右子树路径长度(算当前节点)的最大值
* {
* if(t==NULL)
* {
* return 0;
* }
* int left=path(t->left,t->val); //求左子树最长路径长度
* int right=path(t->right,t->val); //求右子树最长等值路径长度
* max_path=max(max_path,left+right); //返回当前所要求的最长等值路径
* if(t->val==val) //如果是等值的话,返回t的左子树和右子树路径长度(算当前节点)的最大值
* {
* return max(left,right)+1; //返回左子树和右子树路径长度(算当前节点)的最大值
* }
* return 0; //不是等值的直接返回0
* }
* int longestUnivaluePath(TreeNode* root)
* {
* if(root==NULL)
* {
* return 0;
* }
* path(root,root->val);
* cout<<max_path<<endl;
* return max_path;
*}
* };
执行用时 :132 ms, 在所有 cpp 提交中击败了99.48% 的用户
内存消耗 :49.6 MB, 在所有 cpp 提交中击败了82.94%的用户