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;
}

  

原文地址:https://www.cnblogs.com/Oscar67/p/9435037.html

时间: 2024-10-09 06:32:40

Leetcode687. 最长同值路径的相关文章

Leetcode 687.最长同值路径

最长同值路径 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入: 输出: 2 示例 2: 输入: 输出: 2 注意: 给定的二叉树不超过10000个结点. 树的高度不超过1000. 思路 Intuition We can think of any path (of nodes with the same values) as up to two arrows extendi

[LeetCode] 687. Longest Univalue Path 最长唯一值路径

Given a binary tree, find the length of the longest path where each node in the path has the same value. This path may or may not pass through the root. Note: The length of path between two nodes is represented by the number of edges between them. Ex

687. 最长同值路径

给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入: 5 / \ 4 5 / \ \ 1 1 5输出: 2 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-univalue-path 1 package leetCode.binaryTree; 2 public class LongestUnivalueP

LeetCode 687. Longest Univalue Path 最长同值路径 (C++/Java)

题目: Given a binary tree, find the length of the longest path where each node in the path has the same value. This path may or may not pass through the root. The length of path between two nodes is represented by the number of edges between them. Exam

【LeetCode刷题】最长同值路径:妙解

妙啊妙,学一下,最大树路径的题 原文地址:https://www.cnblogs.com/xukaiae86/p/12047329.html

[luogu] P4551 最长异或路径(贪心)

P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一个整数\(N\),表示点数. 接下来 \(n-1\) 行,给出 \(u,v,w\) ,分别表示树上的 \(u\) 点和 \(v\) 点有连边,边的权值是 \(w\). 输出格式: 一行,一个整数表示答案. 输入输出样例 输入样例#1: 复制 4 1 2 3 2

建筑群最长坡值

建筑群最长坡值 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:454            测试通过:168 描述 建筑群所有建筑高度分别为h1.h2-hN,可以得到一些单调递减的序列hi1.hi2-hiK,其长度称为建筑群的坡值,这里1≤i1< i2<-< iK≤N. 你的任务:对于给定的建筑群所有建筑高度,求出建筑群最长坡值. 输入 第一行是建筑群中的建筑数N(1≤N≤1000). 第二行依次给出各个建筑的高度(

LuoguP4551最长异或路径

LuoguP4551最长异或路径 题面 题目链接 题解 01 Trie 题目要求求树上的最长异或路径 很容易想到树上差分 处理每个点的根节点的异或和 讲异或和存进Trie树 按为贪心即可 代码如下: #include<bits/stdc++.h> using namespace std; const int MAXN = 100000 + 10; inline int read() { int f=1,x=0; char ch; do { ch=getchar(); if(ch=='-') f

最长异或路径值

# 题意给定一个n个节点的树,树上的边都具有权值,从树中任意选两个点,求两点上的路径值异或起来的最大值 # 题解 数组D[x]表示根节点到x的路径上所有的边权的xor值,并且结构是树,通过dfs求出所有节点的d求出所有的D数组,那么x节点到y节点上所有的异或权值就是D[x] xor D[y],如果从根分叉的话没有疑问 如果一个节点是另一个节点的祖先节点节点,根据异或性质就可以把从根到祖先节点公共路径抵消原问题就转换成为D[1]~D[n]中选择任意两个数,求最大的异或值. 1 #include<b