题目:
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数 22 ,如下图二元树:
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
思路:
回溯+递归
用forPath数组对路径进行记录,每深一层就令sum-=data,然后判断是否到了叶子节点了并且sum是否等于0,等于0则打印;若还没到叶子节点继续递归
C++代码:
#include <iostream>
using namespace std;
struct BinaryTreeNode{
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
};
class BinaryTree{
public:
BinaryTree(){
root = NULL;
}
~BinaryTree(){
helpFree(root);
}
void insert(int value){
helpInsert(root, value);
}
void inorderPrint(){
helpInorderPrint(root);
}
void findSumRout(int sum){
int forPath[50];
int top = 0;
helpFindSumRoute(root, sum, forPath, top);
}
private:
void helpFindSumRoute(BinaryTreeNode* rt, int &sum, int *forPath, int &top){
forPath[top++] = rt->m_nValue;
sum -= rt->m_nValue;
if (rt->m_pLeft == NULL&&rt->m_pRight == NULL){
if (sum == 0){
for (int j = 0; j < top; j++)
cout << forPath[j] << " ";
cout << endl;
}
}
else {
if (rt->m_pLeft != NULL)
helpFindSumRoute(rt->m_pLeft, sum, forPath, top);
if (rt->m_pRight != NULL)
helpFindSumRoute(rt->m_pRight, sum, forPath, top);
}
top--; //若用引用参数传递,top--以及sum+=rt->m_nValue一定要加上
sum += rt->m_nValue;
}
void helpInorderPrint(BinaryTreeNode* rt){
if (rt != NULL){
helpInorderPrint(rt->m_pLeft);
cout << rt->m_nValue << " ";
helpInorderPrint(rt->m_pRight);
}
}
void helpFree(BinaryTreeNode* rt){
if (rt == NULL)
return;
helpFree(rt->m_pLeft);
helpFree(rt->m_pRight);
delete rt;
}
void helpInsert(BinaryTreeNode* &rt, int &value){
if (rt == NULL){
rt = new BinaryTreeNode();
rt->m_nValue = value;
rt->m_pLeft = NULL;
rt->m_pRight = NULL;
return;
}
if (value < rt->m_nValue)
helpInsert(rt->m_pLeft, value);
else
helpInsert(rt->m_pRight, value);
}
BinaryTreeNode *root;
};
int main(){
BinaryTree forTest;
forTest.insert(10);
forTest.insert(5);
forTest.insert(4);
forTest.insert(12);
forTest.insert(7);
forTest.findSumRout(22);
}