zoukankan      html  css  js  c++  java
  • 在二元树中找出和为某一值的所有路径

    输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
    打印出和与输入整数相等的所有路径。
    例如输入整数22 和如下二元树
              10
            / \
           5  12
          / \
         4   7
    则打印出两条路径:10, 12 和10, 5, 7。

    思路:

    1、当访问到某一节点时,把该结点的值添加到当前和变量,且把该结点压入栈中。

    2、若结点为叶子结点,且当前和变量==期望的和,则打印栈中的结点值,即为所需的路径。

    3、若结点不是叶子结点,继续访问它的左孩子结点,访问它的右孩子结点。

    4、删除该结点。包括从当前和变量中减去结点值,从栈中弹出结点值。此时,已回到父结点。

    程序中的栈,利用STL中的vector,这样简化了编码工作。

    #include <iostream>
    #include <vector>
    using namespace std;
    
    struct BinaryTreeNode
    {
        int m_value;
        BinaryTreeNode* m_pLeft;
        BinaryTreeNode* m_pRight;
    };
    
    vector<BinaryTreeNode *> path;
    void CreateTree(BinaryTreeNode* &root, int* a, int i, int len)
    {
        if (i>=len)
        {
            return;
        }
        root=new BinaryTreeNode;
        root->m_value=a[i];
        root->m_pLeft=NULL;
        root->m_pRight=NULL;
        CreateTree(root->m_pLeft,a,2*i+1,len);
        CreateTree(root->m_pRight,a,2*i+2,len);
    }
    void PreOrder(BinaryTreeNode* &root)
    {
        if (!root)
        {
            return;
        }
        cout<<root->m_value<<"  ";
        PreOrder(root->m_pLeft);
        PreOrder(root->m_pRight);
    }
    void PrintPath(vector<BinaryTreeNode*> &pathvector)
    {
        for (vector<BinaryTreeNode*>::iterator iter=pathvector.begin();iter!=pathvector.end();iter++)
        {
            cout<<(*iter)->m_value<<"  ";
        }
        cout<<endl;
    }
    void PathTree(BinaryTreeNode* &root, int val)
    {
        static int sum=0;
        sum+=root->m_value;
        path.push_back(root);
        if (sum==val&&root->m_pLeft==NULL&&root->m_pRight==NULL)
        {
            PrintPath(path);
        }
        if (root->m_pLeft)
        {
            PathTree(root->m_pLeft,val);
        }
        if (root->m_pRight)
        {
            PathTree(root->m_pRight,val);
        }
        sum -= root->m_value;
        path.pop_back();
    }
    void main()
    {
        BinaryTreeNode* root=0;
        int a[]={10,5,12,7,8};
        int len = sizeof(a)/sizeof(a[0]);
        CreateTree(root,a,0,len);
        PathTree(root,22);
    }
  • 相关阅读:
    MapReduce-文本输入
    MapReduce-输入分片与记录
    python 常用类库
    python leveldb 文档
    火狐插件推荐
    mweb test
    python代码风格规范
    UNICODE,GBK,UTF-8区别
    机器学习之K近邻算法(KNN)
    python中的StringIO模块——html
  • 原文地址:https://www.cnblogs.com/lscheng/p/2838685.html
Copyright © 2011-2022 走看看