zoukankan      html  css  js  c++  java
  • 【Data Structure & Algorithm】二叉树中和为某值的所有路径

    二叉树中和为某值的所有路径


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

    例如输入整数22和如下二叉树:

                         10

                        /  

                       5    12

                      / 

                     4  7

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

    二叉树节点的数据结构定义为

    structBinaryTreeNode
    {
           int m_nValue;
           BinaryTreeNode *m_pLeft;
           BinaryTreeNode *m_pRight;
    }


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

    voidFindPath
    (
        BinaryTreeNode* pTreeNode,
        int expecedSum,
        std::vector<int>&path,
        int& currentSum
    )
    {
           if(!pTreeNode)   return;
          
           currentSum += pTreeNode -> m_nValue;
           path.push_back(pTreeNOde -> m_nValue);
          
           //if the node is a leaf, and the sum isas pre-defined,
           //the path is what we want. print thepath
           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, gotoits 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 nodeand return to its parent node,
    //we should delete this node fromthe path and
    //minus the node’s value from thecurrent sum
    currentSum -= pTreeNode ->m_nValue;
    path.pop_back();
    }

  • 相关阅读:
    select在各个浏览器中的兼容性问题
    pc打开手机站提示切换为手机屏幕
    图片预加载
    div盒子水平垂直居中的方法
    如何检测该浏览器为微信浏览器
    小箭头的写法,z-index在ie7显示混乱问题
    微信a标签不跳转
    css font简写规则
    windows环境cmd下执行jar
    docker制作镜像步骤
  • 原文地址:https://www.cnblogs.com/DianaCody/p/5425710.html
Copyright © 2011-2022 走看看