Leetcode687. 最长同值路径(二叉树遍历,求最长路径,遍历保存优化)

链接:https://leetcode-cn.com/problems/longest-univalue-path

给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。

示例 1:
输入:

      5
     / \
    4   5
   / \   \
  1   1   5

输出:
2

示例 2:
输入:

      1
     / \
    4   5
   / \   \
  4   4   5

输出:
2
注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。

**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

 /* 思路
 * 二叉树的每个节点为根节点展开遍历,判断最大值
 * 提高: 保存每次遍历的值
 */

int search_tree_root(struct TreeNode* root){ 
    if(NULL == root){return 0;}

    static int root_flag = 0; 
    int tmp_flag = root_flag; // tmp_flag == 0 时回到根节点

    int left = 0;
    int right = 0;
    if(NULL != root->left && root->val == root->left->val){
        root_flag++;
        left = search_tree_root(root->left) + 1;
    }
    if(NULL != root->right && root->val == root->right->val){
        root_flag++;
        right = search_tree_root(root->right) + 1;
    }

    // 只有进入的根节点可以左右子树相加求最长路径,子树需要判断左右子树最长路径,取最长
    if(0 == tmp_flag){
        root_flag = 0;  // 提交测试时,max被多个例子修改了,所以这个地方需要让root_flag置0
        return left + right;
    }
    return left > right ? left : right;
    
}

int longestUnivaluePath(struct TreeNode* root){
    if(NULL == root){return 0;}

    static int max = 0;

    int ret = search_tree_root(root);
    if(max < ret){ max = ret;}

    int left;
    int right;
    left = longestUnivaluePath(root->left);
    right = longestUnivaluePath(root->right);

    if(max < left){ max = left;}
    if(max < right){ max = right;}

    // 提交测试时,max被多个例子修改了,所以这个地方需要让max置0
    int tmp = max;
    max = 0;
    return tmp;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章