面试题25 二叉树中和为某一值的路径

代码:

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. #include <vector>  
  4. using namespace std;  
  5.   
  6. struct BinaryTreeNode  
  7. {  
  8.     int  m_nValue;  
  9.     BinaryTreeNode *m_pLeft;  
  10.     BinaryTreeNode *m_pRight;  
  11. };  
  12.   
  13. void FindPath(BinaryTreeNode *pRoot, int nSum, vector<int>& path)  
  14. {  
  15.     if (pRoot == NULL || nSum == 0)  
  16.     {  
  17.         return;  
  18.     }  
  19.   
  20.     if (pRoot->m_nValue == nSum && pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL)  
  21.     {  
  22.       vector<int>::iterator iter = path.begin();  
  23.       for (; iter!=path.end(); iter++)  
  24.       {  
  25.           cout << *iter << " ";  
  26.       }  
  27.       cout << pRoot->m_nValue << endl;  
  28.       return;       
  29.     }  
  30.       
  31.     path.push_back(pRoot->m_nValue);  
  32.   
  33.     if (pRoot->m_pLeft != NULL)  
  34.     {  
  35.         FindPath(pRoot->m_pLeft, nSum-pRoot->m_nValue, path);  
  36.     }  
  37.   
  38.     if (pRoot->m_pRight != NULL)  
  39.     {  
  40.         FindPath(pRoot->m_pRight, nSum-pRoot->m_nValue, path);  
  41.     }  
  42.   
  43.     path.pop_back();  
  44. }  
  45.   
  46. //以先序的方式构建二叉树,输入#表示结点为空  
  47. void CreateBinaryTree(BinaryTreeNode *&pRoot)  
  48. {  
  49.     int nNodeValue = 0;  
  50.     cin >> nNodeValue;      
  51.     if (-1 == nNodeValue)  
  52.     {  
  53.         pRoot = NULL;  
  54.         return;   
  55.     }  
  56.     else  
  57.     {  
  58.         pRoot = new BinaryTreeNode();  
  59.         pRoot->m_nValue = nNodeValue;  
  60.         CreateBinaryTree(pRoot->m_pLeft);  
  61.         CreateBinaryTree(pRoot->m_pRight);  
  62.     }  
  63. }  
  64.   
  65. void PrintInOrder(BinaryTreeNode *&pRoot)  
  66. {  
  67.     if (pRoot != NULL)  
  68.     {  
  69.         PrintInOrder(pRoot->m_pLeft);  
  70.         cout << pRoot->m_nValue << " ";  
  71.         PrintInOrder(pRoot->m_pRight);  
  72.     }  
  73. }  
  74.   
  75. int _tmain(int argc, _TCHAR* argv[])  
  76. {  
  77.     BinaryTreeNode *pRoot = NULL;  
  78.     CreateBinaryTree(pRoot);  
  79.     PrintInOrder(pRoot);  
  80.     cout << endl;  
  81.     vector<int> path;  
  82.     FindPath(pRoot, 22, path);  
  83.     system("pause");  
  84.     return 0;  
  85. }  
说明:用vector模拟实现栈的功能,而不是用stack,是因为在输出路径时,需要遍历栈中的元素,而stack只能取栈顶元素,stack不是最好的选择
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值