二叉树中和为某一值的路径

题目描述

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


二叉树中和为某一值的路径_第1张图片

这是牛客网上的一道原题,题目要求返回一个二维数组,可以求用后序遍历来保存路径,然后判断是否是叶子结点以及路径和是否是输入的值,后序遍历模板如下:


二叉树中和为某一值的路径_第2张图片


生成二维数组需要先将栈中的路径存在一个一维素组中,然后再利用长度进行插入排序,插入到二维数组中,完成代码如下:

class Solution {

public:

vector > FindPath(TreeNode* root,int expectNumber) {

stack S;

TreeNode* p = root ,*r = NULL;

int sum=0;

vector > Q;

while(p||!S.empty()) {

if(p) {

S.push(p);

sum+=p->val;

if(sum==expectNumber&&p->left==NULL&&p->right==NULL) {  //加入数组的条件

int len = S.size();

int cnt = 0;

int lenQ= Q.size();

if(lenQ==0) {    //如果二维数组是空,直接插入

vector Q1;

stack S1 = S;

for(int i=0 ; i

int temp = S1.top()->val;

Q1.insert(Q1.begin(),temp);

S1.pop();

}

Q.insert(Q.begin(),Q1);

} else {   //不然找到在二维数组中插入一维数组的位置

int i;

for(i=0; i

if(len

else {

break;

}

}

vector Q1;

stack S1 = S;

for(int i=0 ; i

int temp = S1.top()->val;

Q1.insert(Q1.begin(),temp);

S1.pop();

}

Q.insert(Q.begin()+cnt,Q1);

}

}

p = p->left;

} else {

p = S.top();

if(p->right&&p->right!=r) {

p = p->right;

} else {

sum-=p->val;

S.pop(); // 出栈          // 访问根

r = p; // 记录最近被访问的结点

p = NULL;

}

}

}

return Q;

}

};

你可能感兴趣的:(二叉树中和为某一值的路径)