/*输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从根的根结点开始往下一直到叶节点
所经过的结点形成一条路径。*/
#include <iostream>
#include <vector>
using namespace std;
//二叉树结点定义
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
};
//创建二叉树结点
BinaryTreeNode *CreateBinaryTreeNode(int ival)
{
BinaryTreeNode *OneNode = new BinaryTreeNode();
OneNode -> m_nValue = ival;
OneNode -> m_pLeft = NULL;
OneNode -> m_pRight = NULL;
return OneNode;
}
//连接结点
void ConnectTreeNodes(BinaryTreeNode *pRoot, BinaryTreeNode *pLeft, BinaryTreeNode *pRight)
{
pRoot -> m_pLeft = pLeft;
pRoot -> m_pRight = pRight;
}
//释放空间(运用递归实现,二叉树的很多算法都是用递归实现的)
void FreeSpace(BinaryTreeNode *OneNode)
{
if(OneNode != NULL)
{
FreeSpace(OneNode -> m_pLeft);
FreeSpace(OneNode -> m_pRight);
delete OneNode;
}
}
//寻找二叉树中和为某一值的路径
void FindPath(BinaryTreeNode *pRoot, int ExpectedSum, vector<int> &path, int CurrentSum)
{
//现在的和值,并将当前结点放入vector容器中
CurrentSum += pRoot -> m_nValue;
path.push_back(pRoot -> m_nValue);
//设置叶子结点判断标志
bool IsLeaf = pRoot -> m_pLeft == NULL && pRoot -> m_pRight == NULL;
//如果是叶子结点并且路径上的结点的和等于输入的值,打印出这条路径
if(CurrentSum == ExpectedSum && IsLeaf)
{
cout << "A Path is found : " << endl;
vector<int> :: iterator iter = path.begin();
for(; iter != path.end(); ++iter)
cout << *iter << " " ;
cout << endl;
}
//如果不是叶子结点,则遍历它的子结点
//判断左结点一支
if(pRoot -> m_pLeft)
FindPath(pRoot -> m_pLeft, ExpectedSum, path, CurrentSum);//递归调用时path是同一个
//判断右结点一支
if(pRoot -> m_pRight)
FindPath(pRoot -> m_pRight, ExpectedSum, path, CurrentSum);
//在返回到父节点之前先删除当前节点,当到叶子结点后和值不满足要求则删除此节点,返回到父节点
path.pop_back();
}
//======测试代码=====
void Test(char *TestName, BinaryTreeNode *pRoot, int ExpectedSum)
{
if(TestName != NULL)
cout << TestName << " Begins: " << endl;
if(pRoot == NULL)
return;
vector<int> path;
int CurrentSum = 0;
FindPath(pRoot, ExpectedSum, path, CurrentSum);
cout << endl;
}
//======测试用例=====
void Test1()
{
BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);
BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
ConnectTreeNodes(pNode10, pNode5, pNode12);
ConnectTreeNodes(pNode5, pNode4, pNode7);
cout << "Two paths should be found in Test1 !" << endl;
Test("Test1", pNode10, 22);
FreeSpace(pNode10);
}
int main()
{
Test1();
return 0;
}
面试题25:二叉树中和为某一值的路径
最新推荐文章于 2023-09-11 23:07:46 发布