题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路:
完成两步:(1)找到符合要求的路径(2)对路径的长度进行排序
步骤(1)的思路:对树进行前序遍历,每次遍历节点后,将节点值加入path中,并将expectNumber减去节点的值,用以判断节点的路径和是否达到要求了。
如果某个节点的左子树为空,右子树为空,路径和等于题目要求,则认为是符合要求的路径,将path加入result中,退出判断。
如果在中途,路径和就达到了要求,那么这个节点下的子树就不需要遍历了,肯定不符合题目要求,直接退出判断。
其他情况则需要继续前序遍历节点左右子树。
退出判断后,需要把path去掉最后一个节点的值,退回上一层节点,因为path需要用来放置另一条路径。
步骤(2)的思路:先重新找一个容器来放置排序好的结果。将原来结果的每个list的长度求出来,作为一个vector容器length,找出length最大值的索引,将该索引所对应的vector放到新的容器里,然后将length对应的位置置0,再重新寻找最大值。直到排序完为止。
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(root) findpath(root,expectNumber);
return sortList(result);
}
void findpath(TreeNode* node,int left)//输入父结点和剩下的值
{
path.push_back(node->val);
if(left-node->val==0&&node->left==NULL&&node->right==NULL)
result.push_back(path);
//如果提前等于零,这条路径就可以不用管的
if(left-node->val==0&&(node->left!=NULL||node->right!=NULL))
{
;
}
else
{
if(node->left) findpath(node->left,left-node->val);
if(node->right) findpath(node->right,left-node->val);
}
//如果已经将当前路径存到result里的,则跳出上述循环,将最后一个节点删除,进行下一个路径的遍历
path.pop_back();
}
//对list进行排序
vector<vector<int>> sortList(vector<vector<int>> unorderedResult)
{
vector<vector<int>> orderedResult;
vector<int> length;
for (auto iter : unorderedResult)
{
length.push_back(iter.size());
}
for (int i = 0;i<length.size();i++)
{
auto maxindex = max_element(length.begin(), length.end());
orderedResult.push_back(unorderedResult[maxindex - length.begin()]);
length[maxindex - length.begin()] = 0;
}
return orderedResult;
}
private:
vector<vector<int>> result;
vector<int> path;
};