题目:输入一个整数和一颗二元树。
从树的根节点开始往下访问一直到叶节点所经过的所有节点形成一条路径。打印出于输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路经10, 12和10, 5, 7
本文程序大部分直接摘抄微软等面试100题的帖子,测试是自己写的,所以测试很烂。
本算法的思想是,建立一个vector记录当前遍历的路径,还有一个变量用来记录当前路径的和。当遍历到一个叶节点便比较当前和与题目给出的那个整数是否相等,若相等,便顺序输出vector的所有值,那便是一条路径。
本算法是在二元树的前向遍历的递归算法的基础上完成的。
当访问一个节点时,首先改变当前路径的和,并将当前元素尾插如vector。然后判断当前节点是否是叶节点,当前和是否与那个整数相等。
当本节点访问完成,回溯时,也要改变当前路径的和的值,并从vector中删除当前节点值。#include<iostream>#include<vector>using namespace std;struct BinaryTreeNode{int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;};void findPath(BinaryTreeNode* pbt,vector<int> &iqueue,int const &sum,int &middlevalue){if(!pbt)return;middlevalue += pbt->m_nValue;iqueue.push_back(pbt->m_nValue);if(middlevalue == sum && !pbt->m_pLeft && !pbt->m_pRight){vector<int>::iterator iter = iqueue.begin();for(;iter != iqueue.end();++iter)cout << *iter << '/t';cout << endl;}if(pbt->m_pLeft)findPath(pbt->m_pLeft,iqueue,sum,middlevalue);if(pbt->m_pRight)findPath(pbt->m_pRight,iqueue,sum,middlevalue);middlevalue -= pbt->m_nValue;iqueue.pop_back();}BinaryTreeNode* createBT(){BinaryTreeNode* pbt;int tmp;cin >> tmp;if(tmp == 0) return 0;else{pbt = new BinaryTreeNode;if(NULL == pbt) return 0;pbt->m_nValue = tmp;pbt->m_pLeft = createBT();pbt->m_pRight = createBT();}return pbt;}int main(){BinaryTreeNode* pbt = createBT();int sum = 22;int tmp = 0;vector<int> path;findPath(pbt,path,sum,tmp);}
那个二元树的建立可以输入题例输入顺序为10回车5回车4回车 0回车0回车7回车0回车0回车12回车0回车0回车,这个建立二元树的方法我也很蛋疼,可是我第一时间想到的就是这个。
那个程序是用g++编译的,呵呵,其实g++是什么东东我也不知道,反正很多细节我根本搞不明白,比如NULL在g++眼里和在vc眼里有什么区别,在什么情况下应该警告g++和vc也是不一致的,所以你要是碰巧想运行我这个程序,一下成功几乎不可能,肯定会有些细节问题要改一改,这个情况,以我现在这初级水平根本不知道怎么解决,这个问题写在这里,希望那位高人能给个链接什么的,可以详细说说c/c++编译器之间的 差别问题。