微软100题第4题

转载 2016年05月31日 23:54:31

转载自:http://blog.csdn.net/luxiaoxun/article/details/7537605

主要技术含量在于vector的使用(可变尺寸数组)和栈的概念。

题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
                                            10
                                            /   \
                                           5   12
                                         /   \   
                                       4     7  
则打印出两条路径:10, 12和10, 5, 7。

分析:这是百度的一道笔试题,考查对树这种基本数据结构以及递归函数的理解。
当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过程。

参考代码:

[cpp] view plain copy
  1. #include <iostream>  
  2. #include <vector>  
  3. using namespace std;  
  4.   
  5. struct Node  
  6. {  
  7.     int value;  
  8.     Node* left;  
  9.     Node* right;  
  10.     Node(){left=NULL;right=NULL;}  
  11.     Node(int v){value=v;left=NULL;right=NULL;}  
  12. };  
  13.   
  14. void findpath(Node* root,vector<int>& nodes,int sum)  
  15. {  
  16.     if(root == NULL) return;  
  17.     nodes.push_back(root->value);  
  18.     if(root->left == NULL && root->right == NULL)  
  19.     {  
  20.         if(root->value == sum)  
  21.         {  
  22.             for(int i=0;i<nodes.size();i++)  
  23.                 cout<<nodes[i]<<" ";  
  24.             cout<<endl;  
  25.         }  
  26.     }  
  27.     else  
  28.     {  
  29.         if(root->left != NULL)  
  30.         {  
  31.             findpath(root->left,nodes,sum-root->value);  
  32.         }  
  33.         if(root->right != NULL)  
  34.         {  
  35.             findpath(root->right,nodes,sum-root->value);  
  36.         }  
  37.     }  
  38.     nodes.pop_back();  
  39. }  
  40.   
  41. int main()  
  42. {  
  43.     Node *tmp ;  
  44.     Node* root = new Node(10);  
  45.     tmp = new Node(5);  
  46.     root->left = tmp ;  
  47.     tmp = new Node(12);  
  48.     root->right = tmp;  
  49.     tmp = new Node(4);  
  50.     root->left->left = tmp;  
  51.     tmp = new Node(7);  
  52.     root->left->right = tmp;  
  53.     vector<int> v;  
  54.     findpath(root,v,22);   
  55.     return 0;  

相关文章推荐

数据结构和算法经典100题-第4题

题目 4.在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如输...

微软 百度 华为笔试题经典100题

  • 2014年08月30日 23:41
  • 3.82MB
  • 下载

微软面试100题

  • 2015年07月24日 16:10
  • 359KB
  • 下载

微软面试100题总结及答案及下载地址

横空出世,席卷互联网                                                                          ---评微软数据结构+算法...
  • YSBJ123
  • YSBJ123
  • 2016年07月13日 14:36
  • 441

微软面试100题

  • 2013年01月23日 23:52
  • 91KB
  • 下载

微软面试100题2010年版全部答案集锦(含下载地址)

From:http://blog.csdn.net/v_july_v/article/details/6870251  微软等数据结构+算法面试100题全部答案集锦 ...

微软面试100题2010年版全部答案集锦(含下载地址)

微软等数据结构+算法面试100题全部答案集锦作者:July、阿财。时间:二零一一年十月十三日。引言     无私分享造就开源的辉煌。     今是二零一一年十月十三日,明日14日即是本人刚好开博一周年...
  • v_JULY_v
  • v_JULY_v
  • 2011年10月13日 15:25
  • 196522
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微软100题第4题
举报原因:
原因补充:

(最多只允许输入30个字)