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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树中和为某一值的路径——25相关的知识,希望对你有一定的参考价值。

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

技术分享

    如上图的二叉树,当输入根结点和一个数值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;
}


运行程序:

技术分享



《完》

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

以上是关于二叉树中和为某一值的路径——25的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer——二叉树中和为某一值的路径》代码

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

二叉树中和为某一值的路径-剑指Offer

34二叉树中和为某一值的路径 //代码未通过

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

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