微软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题系列(部分)

本文整理自:http://blog.csdn.net/v_july_v/article/details/6543438     1. 把二元查找树转变成排序的双向链表     题目: 输入一棵二元查...
  • zhoudaxia
  • zhoudaxia
  • 2014年07月10日 14:29
  • 16355

微软等数据结构+算法面试100题全部答案集锦

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ ...
  • lipengshiwo
  • lipengshiwo
  • 2016年11月26日 17:28
  • 3374

微软等数据结构+算法面试100题全部答案集锦

微软等数据结构+算法面试100题全部答案集锦 作者:July、阿财。 时间:二零一一年十月十三日。 引言      无私分享造就开源的辉煌。      今是二零一一年十月十三...
  • GarfieldEr007
  • GarfieldEr007
  • 2015年10月06日 14:04
  • 5613

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

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

微软面试100题

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

微软面试100题

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

微软面试100题系列之高清完整版PDF文档[带目录+标签]by_July

  • 2012年09月20日 23:01
  • 4.43MB
  • 下载

微软、谷歌、百度等公司经典面试100题[第101-170题

  • 2013年07月31日 17:12
  • 651KB
  • 下载

[最新答案V0.4版]微软等数据结构+算法面试100题[第41-60题答案]

  • 2011年01月04日 00:23
  • 351KB
  • 下载

微软等数据结构+算法面试100题.rar

  • 2011年05月31日 15:29
  • 274KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微软100题第4题
举报原因:
原因补充:

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