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

题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

代码

/*
struct TreeNode 
{
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:
    vector<vector<int> > FindPath(TreeNode* root, int expectNumber) 
    {
        vector<vector<int> > res;   
        if (NULL == root)
        {
            return res;
        }
        stack<TreeNode *> s;   //当前路径
        s.push(root);
        int sum = 0;           //当前和
        vector<int> curPath;   
        TreeNode *cur = root;  //当前节点
        TreeNode *last = NULL; //保存上一个节点
        while (!s.empty())
        {
            if (NULL == cur)
            {
                TreeNode *temp = s.top();
                if (temp->right != NULL && temp->right != last)
                {
                    cur = temp->right; //转向未遍历过的右子树
                }
                else
                {
                    last = temp; //保存上一个已遍历的节点
                    s.pop();
                    curPath.pop_back(); //从当前路径删除
                    sum -= temp->val;
                }  
            }
            else
            {
                s.push(cur);
                sum += cur->val;
                curPath.push_back(cur->val);
                if (cur->left == NULL && cur->right == NULL && sum == expectNumber)
                {
                    res.push_back(curPath);
                }
                cur = cur->left; //先序遍历,左子树先于右子树
            }
        }
        return res;
    }
};

运行结果
运行时间:4ms
占用内存:492k

解题思路
//非递归版本
1.按先序遍历把当前节点 cur 的左孩子依次入栈同时保存当前节点,每次更新当前路径的和 sum;
2.判断当前节点是否是叶子节点以及 sum 是否等于 expectNumber,如果是,把当前路径放入结果中。
3.遇到叶子节点 cur 更新为 NULL,此时看栈顶元素,如果栈顶元素的把栈顶元素保存在 last 变量中,同时弹出栈顶元素,当期路径中栈顶元素弹出,sum 减掉栈顶元素,这一步骤不更改 cur 的值;
4.如果步骤3中的栈顶元素的右孩子存在且右孩子之前没有遍历过,当前节点 cur 更新为栈顶的右孩子,此时改变 cur=NULL 的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值