二叉树中和为某一值的路径——25

    输入一个二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

wKiom1dFDnWQdxTiAAALYrM1qGA376.png

    如上图的二叉树,当输入根结点和一个数值12的时候,就有两条路径“1->2->4->5”和“1->3->8”,如果存在,就输出上述路径,如果没有任何一条路径满足就不输出路径并提示;

    首先,路径一定是从根结点开始到某个叶子结点结束,这才是一条路径,因此,应该最先访问的就是根结点,而在二叉树的先中后序遍历中只有先序遍历是最先访根结点的,所以可以用如下方法:用先序遍历方法遍历二叉树,每当经过一个结点的时候就将其值进行保存相加,如果中途发现或者到达叶子结点之后,当前路径相加得到的值并不满足要求的值,则往回退并将值减去,或者当前路径已经满足,则需要再去换一条路径访问看是否还有其他路径满足条件,而能够提供往回退的方法就只有递归了,直至遍历完毕二叉树;


程序设计如下:

#include <iostream>#include <assert.h>#include <vector>using namespace std;struct BinaryTreeNode//二叉树结点数据结构{    int _val;    BinaryTreeNode *_Lnode;    BinaryTreeNode *_Rnode;    BinaryTreeNode(int val)        :_val(val)         ,_Lnode(NULL)         ,_Rnode(NULL)    {}};BinaryTreeNode* _Create(int *arr, size_t& index, size_t size)//创建二叉树{    if((index < size) && (arr[index] != '#'))    {        BinaryTreeNode *root = new BinaryTreeNode(arr[index]);        root->_Lnode = _Create(arr, ++index, size);        root->_Rnode = _Create(arr, ++index, size);        return root;    }    else        return NULL;}BinaryTreeNode* CreateBinaryTree(int *arr, size_t size){    assert(arr && size);    size_t index = 0;    return _Create(arr, index, size);}void DestoryBinaryTree(BinaryTreeNode *root)//销毁二叉树{    if(root != NULL)    {        DestoryBinaryTree(root->_Lnode);        DestoryBinaryTree(root->_Rnode);        delete root;    }}void PrevOrder(BinaryTreeNode *root)//前序遍历打印出二叉树{    if(root != NULL)    {        cout<<root->_val<<" ";        PrevOrder(root->_Lnode);        PrevOrder(root->_Rnode);    }}void _Count(BinaryTreeNode* root, vector<int> *pv, int& count, int num){    if(root != NULL)    {        count += root->_val;//每当一个结点不为NULL的时候,就将其放入容器中且加上其值        (*pv).push_back(root->_val);        _Count(root->_Lnode, pv, count, num);        _Count(root->_Rnode, pv, count, num);        if(count == num)//当找到一个路径的时候就将其打印出来        {            cout<<"A Path Is : ";            for(size_t i = 0; i < (*pv).size(); ++i)                cout<<(*pv)[i]<<"->";            cout<<"NULL"<<endl;        }        count -= (*pv).back();//退回上一步        (*pv).pop_back();    }}void PrintPathOfNumInBT(BinaryTreeNode *root, int num)//打印路径{    assert(root);    vector<int> v;//用一个容器来存放路径    int count = 0;//用一个计数器计算和    _Count(root, &v, count, num);}int main(){    int arr[] = {1,2,6,'#','#',4,5,'#','#','#',3,7,'#','#',8,'#','#'};    int num = 12;    BinaryTreeNode *root = CreateBinaryTree(arr, sizeof(arr)/sizeof(arr[0]));    cout<<"PrevOrder:";    PrevOrder(root);    cout<<endl;    PrintPathOfNumInBT(root, num);    DestoryBinaryTree(root);    return 0;}


运行程序:

wKioL1dGuqvgoxDNAAAIPHY3A4A100.png



《完》

本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1783531

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值