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

    xiaoxiao2025-01-20  8

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

    思想: 设置两个变量 vector<vector<int> > allPath; vector<int> path;来保存记忆信息。结合递归的思想,expectNumber - root->val即为下一个节点判断的数字和。 如果没有到达叶子节点,则将当前节点的加入到路径中,更新expectNumber的值,继续递归遍历左右子树。 如果到达该叶子节点时expectNumber变成0,说明包含该节点的该路径的满足条件,则将整条路径添加最后的结果中,并删除从路径中删除该节点, 回退到其双亲结点,继续判断该双亲的其他节点是否也满足条件; 如果到达该叶子节点时没有使expectNumber变成0,说明包含该节点的该路径的不满足,则删除从路径中删除该节点, 回退到其双亲结点,继续判断该双亲的其他节点是否也满足条件;

    /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { vector<vector<int> > allPath; vector<int> path; public: vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { if(!root) return allPath; int currentNumber = expectNumber - root->val; path.push_back(root->val); if(currentNumber == 0 && !root->left && !root->right) allPath.push_back(path); if(root->left) FindPath(root->left, currentNumber); if(root->right) FindPath(root->right, currentNumber); path.pop_back(); return allPath; } };
    最新回复(0)