题目:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
使用非递归方式,也相当于进行先序遍历,将左子树节点压入栈内保存,直至叶子节点,计算遍历过程中路径的总长度,然后在遍历值叶子节点后判断路径长度和与所给定的路径值比较,如果相等则将此路径保存;否则,将当前的栈顶元素出栈,遍历右子树,直至遍历结束。
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<vector<int> >vec;
if(root == NULL)
return vec;
int sum = 0 ;
stack<TreeNode*> stac;
stac.push(root); //根节点入栈
vector<int> cur_path; //存储当前路径
TreeNode* cur = root;
TreeNode* pre = NULL; //当前节点的上一个节点
while(!stac.empty()){
if(cur == NULL){
TreeNode* temp = stac.top();
if(temp->right!=NULL && temp->right!=pre)
cur = temp->right; //转向右子树
else{
pre = temp;
stac.pop();
cur_path.pop_back();
sum -= temp->val;
}
}
else{
stac.push(cur);
cur_path.push_back(cur->val);
sum +=cur->val;
if(cur->left==NULL && cur->right==NULL && sum == expectNumber)
vec.push_back(cur_path);
cur = cur->left;
}
}
return vec;
}