zoukankan      html  css  js  c++  java
  • 面试题25:二叉树中和为某一值的路径

    题目描述

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

    题目分析

    剑指Offer(纪念版)P143

    代码实现

    我们用标准模板库中的vector实现了一个栈来保存路径,这里没有直接用STL中的stack的原因是在stack中只能得到栈顶元素,而我们打印路径的时候需要得到路径上的所有结点,因此在代码实现的时候stack不是最好的选择。

    void FindPath(BinaryTreeNode* pRoot, int expectedSum)
    {
        if(pRoot == NULL)
            return;
    
        std::vector<int> path;
        int currentSum = 0;
        FindPath(pRoot, expectedSum, path, currentSum);
    }
    
    void FindPath
    (
        BinaryTreeNode*   pRoot,        
        int               expectedSum,  
        std::vector<int>& path,         
        int&              currentSum
    )
    {
        currentSum += pRoot->m_nValue;
        path.push_back(pRoot->m_nValue);
    
        // 如果是叶结点,并且路径上结点的和等于输入的值
        // 打印出这条路径
        bool isLeaf = pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL;
        if(currentSum == expectedSum && isLeaf)
        {
            printf("A path is found: ");
            std::vector<int>::iterator iter = path.begin();
            for(; iter != path.end(); ++ iter)
                printf("%d	", *iter);
            
            printf("
    ");
        }
    
        // 如果不是叶结点,则遍历它的子结点
        if(pRoot->m_pLeft != NULL)
            FindPath(pRoot->m_pLeft, expectedSum, path, currentSum);
        if(pRoot->m_pRight != NULL)
            FindPath(pRoot->m_pRight, expectedSum, path, currentSum);
    
        // 在返回到父结点之前,在路径上删除当前结点,
        // 并在currentSum中减去当前结点的值
        currentSum -= pRoot->m_nValue;  // 书上没有。。。
        path.pop_back();
    }
    

      

  • 相关阅读:
    C++实现base64编码
    php实现base64编码
    美团2016研发工程师笔试题(绑鞋带问题)
    URL encode 与 URL decode 的C语言实现
    常用排序算法集合-C实现
    用文件实现计算器要求多进程同时写
    vim操作命令-笔记
    Can't connect to local MySQL server through socket
    小程序页面跳转数据丢失
    Vue路由 --登录状态的判断
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4832372.html
Copyright © 2011-2022 走看看