二叉树遍历求差值绝对值最大值
来源:互联网 发布:武汉网络推广外包 编辑:程序博客网 时间:2024/06/05 09:38
来自阿里巴巴2015年笔试题,参考牛客网。
写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这颗二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
这道题目可以通过遍历整个二叉树,求解二叉树中最大值和最小值,最后算出最大的差值。
可以定义一个二叉树,如下图。
初始化二叉树结点、链接结点、二叉树的结构的定义
struct BinTree{int data;BinTree * lchild;BinTree * rchild;};BinTree * createnode(int val){BinTree * node=new BinTree;node->data=val;node->lchild=NULL;node->rchild=NULL;return node;}void connectnode(BinTree * f,BinTree * lchild,BinTree *rchild){if(f==NULL)return ;f->lchild=lchild;f->rchild=rchild;}对于二叉树可以按层遍历,图中二叉树按层遍历的结果为1 2 3 4 5 6 7。
二叉树按层遍历,可以利用STL队列。
int find_max_diff1(BinTree* head)//按层遍历{queue<BinTree*> q;BinTree* p;if (NULL==head){return -1;}int max1=INT_MIN;//初始化最大值int min1=INT_MAX;//初始化最小值q.push(head);while (!q.empty()){p = q.front();q.pop();if(p->data>max1)max1=p->data;if(p->data<min1)min1=p->data;if (p->lchild!=NULL){q.push(p->lchild);}if (p->rchild!=NULL){q.push(p->rchild);}}return (max1-min1);}当输入的head指针为NULL,表明二叉树为空,返回-1代表输入参数异常。
除了按层遍历外,使用的最多的要数先序遍历。先序遍历先输出二叉树的根结点,再分别对根节点的左子树与右子树进行相同的操作,既可以用递归的方式实现,也可以用循环的方式实现。
以递归的方式实现二叉树遍历:
先定义两个全局变量,min1、max1。通过函数递归的过程,来修改min1、max1的数值,最后函数find_max_diff2返回max1-min1。
int min1=INT_MAX;//全局变量int max1=INT_MIN;void midprint(BinTree * head)//递归先序遍历{if(head==NULL)return;if(head->data> max1)max1=head->data;if(head->data<min1)min1=head->data;midprint(head->lchild);midprint(head->rchild);}int find_max_diff2(BinTree * head){if(head==NULL)//当输入空指针return -1;midprint(head);return max1-min1;}
以循环的方式现实二叉树遍历。
int find_max_diff3(BinTree *head)//先序遍历循环{ stack<BinTree*> s; BinTree *p=head;if(head==NULL)return -1; int max1 = p->data; int min1 = p->data; while(p!=NULL||!s.empty()) { while(p!=NULL) { s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top();//cout<<p->data<<" "; if(p->data > max1) { max1 = p->data; } if(p->data < min1) { min1 = p->data; } s.pop(); p=p->rchild; } } return abs(max1 - min1); }测试程序:
int main(){BinTree *node1=createnode(1);BinTree *node2=createnode(2);BinTree *node3=createnode(3);BinTree *node4=createnode(4);BinTree *node5=createnode(5);BinTree *node6=createnode(6);BinTree *node7=createnode(7);connectnode(node1,node2,node3);connectnode(node2,node4,node5);connectnode(node3,node6,node7);cout<<find_max_diff1(node1)<<endl;cout<<find_max_diff2(node1)<<endl;cout<<find_max_diff3(node1)<<endl;return 0;}
测试结果:
0 0
- 二叉树遍历求差值绝对值最大值
- 阿里14笔试题-求一个二叉树最大值和最小值的差值绝对值
- 求整型二叉树节点差值的最大绝对值
- 二叉树创建,遍历和求最大值
- 笔试:求二叉树中相差最大的两个节点间的差值绝对值
- 求绝对值最大值
- 求绝对值最大值
- 求绝对值最大值
- 求绝对值最大值
- 求绝对值最大值
- 求绝对值最大值
- 求绝对值最大值
- [阿里2015校招笔试]求二叉树中相差最大的两个节点间的差值绝对值
- 求绝对值最大值 (sdut oj)
- SDUT-1147 求绝对值最大值
- 求二叉树节点的最大差值
- 山东理工ACM【1147】求绝对值最大值
- 树的遍历求最大值---java
- 访问者模式
- Linux下xargs命令详解
- HDU 5410 CRB and His Birthday(01背包+完全背包)
- 12C标量子查询中的BUG
- 简单封装的httpclient
- 二叉树遍历求差值绝对值最大值
- C++中虚函数与晚绑定的编译器实现
- MySQL 调优/优化的 100 个建议
- 单例设计模式
- asoundrc配置文件简单介绍
- KM算法板子2
- Hoeffding不等式的证明
- HDU 1032.The 3n + 1 problem【注意细节】【估计数据不强】【8月21】
- eclipse导出可执行的jar包