网易实习生笔试题:二叉树
2016-07-23 09:00
239 查看
题目描述:
有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。
给定二叉树的根节点root,请返回所求距离。
有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。
给定二叉树的根节点root,请返回所求距离。
class Tree { void Inorder(TreeNode *root,vector<int>&v,int &small,int &big){ //中序遍历获得最小的叶节点和最大的叶节点的索引 if(!root) return; Inorder(root->left, v, small, big); v.push_back(root->val); if(root->left==NULL&&root->right==NULL){//叶子节点 if(small==-1||big==-1) small = big =(int)v.size()-1; else{ if(root->val<v[small]) small = (int)v.size()-1; if(root->val>v[big]) big = (int)v.size()-1; } } Inorder(root->right, v, small, big); } public: int getDis(TreeNode* root) { int small = -1,big = -1; vector<int>v; Inorder(root, v, small, big); TreeNode * p = root; vector<int>v1,v2; int pos; while (true) {//寻找路径 pos = (int)(find(v.begin(), v.end(),p->val)-v.begin()); v1.push_back(v[pos]); if(small>pos) p = p->right; else if(small<pos) p = p->left; else break; } p = root; while (true) { pos = (int)(find(v.begin(), v.end(),p->val)-v.begin()); v2.push_back(v[pos]); if(big>pos) p = p->right; else if(big<pos) p = p->left; else break; } int i,j; for (i=0,j=0;j<v2.size()-1&&i<v1.size()-1; ++i,++j) {//去重 if(!(v1[i]==v2[j]&&v1[i+1]==v2[j+1])) break; } return (int)v1.size()-1+(int)v2.size()-1-2*i; } };
相关文章推荐
- Web压缩过滤器
- SOC_SINGLE(xname, reg, shift, max, invert) 参数测试
- 线段树单点更新 区间求和,求最值
- Maven那点事儿(Eclipse版)
- 引用的图片
- 郑大校赛-NYOJ-201-作业题(动态规划)
- poj 2105 大数
- golang实现通过smtp发送电子邮件的方法
- 【杭电】[1009]FatMouse' Trade
- Apache Maven 入门篇(下)
- [翻译,boost]共享内存_3_内存映射文件
- Apache Maven 入门篇 ( 上 )
- UIButton的基本属性和方法
- Activity生命周期
- 经典DFS之N皇后问题
- Java内存区域——运行时数据区域
- 用exe4j发布带数据库的java程序
- Git用户手册--Git 基础
- Linux 技巧:让进程在后台可靠运行的几种方法
- tutorial