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

/*输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从根的根结点开始往下一直到叶节点
所经过的结点形成一条路径。*/
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值