• 二元树中和为某一值的所有路径


    题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。

    例如输入整数22和如下二元树

                                                10
                                               /  
                                              5     12
                                            /      
                                          4     7 

    则打印出两条路径:10, 12和10, 5, 7。

    二元树结点的数据结构定义为:

    struct BinaryTreeNode // a node in the binary tree
    {
          int              m_nValue; // value of node
          BinaryTreeNode  *m_pLeft;  // left child of node
          BinaryTreeNode  *m_pRight; // right child of node
    };
    

    分析:这是百度的一道笔试题,考查对树这种基本数据结构以及递归函数的理解。

    当 访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把 它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。因此我们在函数退出之前要在路径上删除当前 结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用 状态一致,而递归调用本质就是一个压栈和出栈的过程。

    参考代码:

     

    ///////////////////////////////////////////////////////////////////////
    // Find paths whose sum equal to expected sum
    ///////////////////////////////////////////////////////////////////////
    void FindPath
    (
          BinaryTreeNode*   pTreeNode,    // a node of binary tree
          int               expectedSum,  // the expected sum
          std::vector<int>& path,         // a path from root to current node
          int&              currentSum    // the sum of path
    )
    {
          if(!pTreeNode)
                return;
    
          currentSum += pTreeNode->m_nValue;
          path.push_back(pTreeNode->m_nValue);
    
          // if the node is a leaf, and the sum is same as pre-defined, 
          // the path is what we want. print the path
          bool isLeaf = (!pTreeNode->m_pLeft && !pTreeNode->m_pRight);
          if(currentSum == expectedSum && isLeaf)
          {    
               std::vector<int>::iterator iter = path.begin();
               for(; iter != path.end(); ++ iter)
                     std::cout << *iter << '	';
               std::cout << std::endl;
          }
    
          // if the node is not a leaf, goto its children
          if(pTreeNode->m_pLeft)
                FindPath(pTreeNode->m_pLeft, expectedSum, path, currentSum);
          if(pTreeNode->m_pRight)
                FindPath(pTreeNode->m_pRight, expectedSum, path, currentSum);
    
          // when we finish visiting a node and return to its parent node,
          // we should delete this node from the path and 
          // minus the node's value from the current sum
          currentSum -= pTreeNode->m_nValue;
          path.pop_back();
    } 
    

    来源:http://zhedahht.blog.163.com/blog/static/254111742007228357325/

  • 相关阅读:
    Python学习
    shell 脚本收藏
    无限级分类接口
    php 过滤多维数组中值为空的字段
    逆波兰表达式3(后缀表达式求值)
    [数据结构]之队列
    最大公约数和最小公倍数
    暗时间阅读笔记
    android判断文件是否是图片文件的方法
    android从assets读取文件的方法
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3400013.html
Copyright © 2020-2023  润新知