zoukankan      html  css  js  c++  java
  • Leetcode687. 最长同值路径

      这个路径可能存在从子节点经过父节点,再到子节点的情况,所有从当前节点构成的路径需要考虑左右两条路径相加,用递归,求得左右的最长路径,相加,即为所求

    // Study.cpp: 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    #include <unordered_map>
    #include <unordered_set>
    #include <queue>
    #include <string>
    #include <algorithm>
    #include <sstream>
    #include <set>
    #include <stack>
    #include <iomanip>
    #define INT_MAX 2147483647 // maximum (signed) int value
    #define INT_MIN (-2147483647 - 1) // minimum (signed) int value
    ;
    
    
    using namespace std;
    
    int Max(int a, int b)
    {
    	return a > b ? a : b;
    }
    
    int Min(int a, int b)
    {
    	return a < b ? a : b;
    }
    struct TreeNode {
    	int val;
    	TreeNode *left;
    	TreeNode *right;
    	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    	
    };
    int rmax = 0;
    int find_depth(TreeNode* p, int value)
    {
     	if (p == nullptr || p->val != value)
    		return 0;
    
    	int left = 0, right = 0;
    	left = find_depth(p->left,value);
    	right = find_depth(p->right,value);
    
    	return 1 + Max(left, right);
    	
    }
    void solution(TreeNode* p)
    {
    	if (p == nullptr)
    		return;
    	
    	int current = find_depth(p->left, p->val) +  find_depth(p->right, p->val);
    	if (current > rmax)
    		rmax = current;
    	solution(p->left);
    	solution(p->right);
    }
    
    
    int longestUnivaluePath(TreeNode* root) {
    	solution(root);
    	return rmax;
    }
    
    void printTree(TreeNode* p,int depth=0)
    {
    	if (p == nullptr)
    		return;
    
    	for (int i = 0; i < depth; i++)
    		cout << " ";
    	cout << p->val << endl;
    
    	printTree(p->left,depth+1);
    	printTree(p->right, depth+1);
    }
    int main()
    {
    	TreeNode* root = new TreeNode(1);
    	root->left = new TreeNode(2);
    	root->right = new TreeNode(2);
    
    	TreeNode* p = root->left;
    	p->left = new TreeNode(2);
    	p->right = new TreeNode(2);
    	p->left->left = new TreeNode(2);
    	//printTree(p);
    	p = root->right;
    	p->left = new TreeNode(2);
    	p->right = new TreeNode(2);
    
    	printTree(root);
    	cout << endl;
    
    	cout << longestUnivaluePath(root);
    	system("pause");
    	return 0;
    }
    

      

  • 相关阅读:
    js(四) 全选/全不选和反选
    js(三) ajax异步局部刷新技术底层代码实现
    js(二) 实现省市联动(json)
    接口
    内部类
    封装
    Static关键字
    this关键字
    带参数的方法
    abstract关键字
  • 原文地址:https://www.cnblogs.com/Oscar67/p/9435037.html
Copyright © 2011-2022 走看看