算法题15 二叉树的最长的路径长度&&最大路径和
2016-02-03 15:04
417 查看
题目
给定一个二叉树,任意两个节点之间必然是有一条路径相通的,假定父节点和它的孩子节点的距离为单位1,求二叉树中相距最远的两个节点间的路径长度
分析
这是一个简单的动态规划问题,假设某个节点node,到它的最低叶节点的长度为len(node),所求的最长路径必然经过一个最高节点high_node,
则它到最低叶节点的长度为len(high_node)=max(len(high_node->left),len(high_node->right))+1,路径长度为sum=len(high_node->left)+len(high_node->right)+2;
代码
最大路径和问题
下面再看最大路径和问题(路径和为两个节点之间所在路径上的节点权值之和)。这个问题和上题非常相似,只不过是把单位距离换成了节点上的权值而已。
同样,假设某个节点node,到它的最低叶节点的长度为sum(node),所求的最长路径必然经过一个最高节点high_node,
则它到最低叶节点的长度为sum(high_node)=max(sum(high_node->left),sum(high_node->right))+high_node->value,路径和path_sum=sum(high_node->left)+sum(high_node->right)+high_node->value;
给定一个二叉树,任意两个节点之间必然是有一条路径相通的,假定父节点和它的孩子节点的距离为单位1,求二叉树中相距最远的两个节点间的路径长度
分析
这是一个简单的动态规划问题,假设某个节点node,到它的最低叶节点的长度为len(node),所求的最长路径必然经过一个最高节点high_node,
则它到最低叶节点的长度为len(high_node)=max(len(high_node->left),len(high_node->right))+1,路径长度为sum=len(high_node->left)+len(high_node->right)+2;
代码
int MaxDistance(TreeNode* root,int* max) { if (root->pLeft==NULL&&root->pRight==NULL) { return 0; } int left_len=0,right_len=0; if (root->pLeft!=NULL) { left_len=MaxDistance(root->pLeft,max)+1; } if (root->pRight!=NULL) { right_len=MaxDistance(root->pRight,max)+1; } int sum=left_len+right_len+2; *max=(*max>sum)?*max:sum; return (left_len>right_len)?left_len:right_len; }
最大路径和问题
下面再看最大路径和问题(路径和为两个节点之间所在路径上的节点权值之和)。这个问题和上题非常相似,只不过是把单位距离换成了节点上的权值而已。
同样,假设某个节点node,到它的最低叶节点的长度为sum(node),所求的最长路径必然经过一个最高节点high_node,
则它到最低叶节点的长度为sum(high_node)=max(sum(high_node->left),sum(high_node->right))+high_node->value,路径和path_sum=sum(high_node->left)+sum(high_node->right)+high_node->value;
int MaxPathSum(TreeNode* root,int* maxsum) { int val=root->value; if (root->pLeft==NULL&&root->pRight==NULL) { return val; } int left=0,right=0; if (root->pLeft!=NULL) { left=MaxPathSum(root->pLeft,maxsum)+val; } if (root->pRight!=NULL) { right=MaxPathSum(root->pRight,maxsum)+val; } int sum=left+right-val; *maxsum=(*maxsum>sum)?*maxsum:sum; return (left>right)?left:right; }
相关文章推荐
- pwd 命令
- 一个比红帽还酷炫的Linux国际认证考试-Linux权威认证
- Win8系统无法打开应用商店且提示“服务器错误”及错误代码0x80072EE7的解决方法
- Struts2中Action访问Servlet API的三种方法
- 无法升级win10检测提示CPU温度过高怎么办?解决方法
- 线性表的查找(顺序查找,二分查找,分块查找)
- Android 使用动态载入框架DL进行插件化开发
- store.js 跨浏览器的localStorage
- IOS-OC之高级组件PickerView之二
- hdu 3661 Assignments【贪心】
- org.hibernate.QueryException: could not resolve property:xxxxxid 外键查询 hibernate
- srping mvc学习
- java数据库编程——执行查询操作(二)
- PEP8 Python编码规范
- 图的基本算法(BFS和DFS)
- 筛法求素数
- 正则表达式情景积累
- 有帮助的文章,代码!
- linux如何查看命令对于的是哪个软件包&linux排错思路
- wget常用命令