题目:在二元树中找出和为某一值的所有路径
输入一个整数和一棵二元树(二叉搜索树)。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出 和 与 输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
思路:
1、当访问到某一节点时,把该结点的值 添加到 当前和变量,且把该结点压入栈(栈就是一种可以实现“先进后出(或者叫后进先出)”的存储结构。)中。
2、若结点为叶子结点,且当前和变量==期望的和,则打印栈中的结点值,即为所需的路径。
3、若结点不是叶子结点,继续访问它的左孩子结点,访问它的右孩子结点。
4、删除该结点。包括从当前和变量中减去结点值,从栈中弹出结点值。此时,已回到父结点。
输入一个整数和一棵二元树(二叉搜索树)。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出 和 与 输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
思路:
1、当访问到某一节点时,把该结点的值 添加到 当前和变量,且把该结点压入栈(栈就是一种可以实现“先进后出(或者叫后进先出)”的存储结构。)中。
2、若结点为叶子结点,且当前和变量==期望的和,则打印栈中的结点值,即为所需的路径。
3、若结点不是叶子结点,继续访问它的左孩子结点,访问它的右孩子结点。
4、删除该结点。包括从当前和变量中减去结点值,从栈中弹出结点值。此时,已回到父结点。
程序中的栈,利用STL中的vector,这样简化了编码工作。
#include<iostream>
#include<vector>
#include<stdlib.h>
using namespace std;
struct BinaryTreeNode
{
int m_nvalue;
BinaryTreeNode * m_pLeft;
BinaryTreeNode * m_pRight;
};
void findPath (BinaryTreeNode *pTreeNode,
int expectedSum,
vector<int>& path,
int & currentSum)
{
if(!pTreeNode)
return ;
//节点添加至当前和变量中
//节点压入栈中
currentSum += pTreeNode->m_nvalue;
path.push_back(pTreeNode->m_nvalue);
bool isLeaf = !(pTreeNode->m_pLeft)&&!(pTreeNode->m_pRight);
//当前节点为叶子节点,且和为期望值,打印路径
if(currentSum == expectedSum && isLeaf)
{
vector<int>::iterator iter;
for(iter = path.begin();iter != path.end();iter++)
{
cout<<*iter<<"\t";
}
cout<<endl;}
//当前节点不为叶子节点,查找它的左右孩子节点
if(pTreeNode->m_pLeft)
findPath(pTreeNode->m_pLeft,
expectedSum,path,currentSum);
if(pTreeNode->m_pRight)
findPath(pTreeNode->m_pRight,
expectedSum,path,currentSum);
//当前节点删除,退至其父节点
currentSum -= pTreeNode->m_nvalue;
path.pop_back();
}
void addTree (BinaryTreeNode **T,int num)
{
if (*T ==NULL)
{
*T=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
(*T)->m_nvalue = num;
(*T)->m_pLeft = NULL;
(*T)->m_pRight = NULL;
}
else if((*T)->m_nvalue>num)
addTree(&((*T)->m_pLeft),num);
else if((*T)->m_nvalue<num)
addTree(&((*T)->m_pRight),num);
else
cout<<"重复加入同一节点"<<endl;
}
int main()
{
BinaryTreeNode *T =NULL;
addTree(&T,10);
addTree(&T,12);
addTree(&T, 5);
addTree(&T, 7);
addTree(&T, 4);
int sum =0;
vector<int> path;
findPath (T,22,path,sum);
return 0;
}