算法day43 二叉树的所有路径
题目描述

思路:前序递归+回溯
要搜寻二叉树的所有路径,依然绕不开递归算法,此时要注意的是在判断一条路径是否已经到达终点(即是否搜寻到了叶节点)的过程中,我们应该在判断叶节点之前收集叶节点保存的值,否则会跳过叶节点值的收集,导致漏值。同时,在搜寻到尾部之后,需要不断的回溯回到相对的根节点,方便再次搜寻另外的路径,完整的代码如下。
void traversal(TreeNode * cur,vector<int> & value,vector<string> &res){
//以前序遍历过程进行遍历
//这里要在判断是否是叶节点之前进行值的获取,否则会遗漏
value.push_back(cur->val);
//判断是否是叶节点,叶节点的话,说明一条路径上的值已经收集完毕,此时进行字符串拼接,加入到res中
if(cur->left == nullptr && cur -> right == nullptr){
string s;
for(int i = 0 ;i < value.size();i++){
if(i != value.size()-1){
s += to_string(value[i]) + "->";
}else{
s += to_string(value[i]);
}
}
res.push_back(s);
return ;
}
//如果左侧还存在,那么递归遍历把左侧的路径找出来
if(cur -> left){
traversal(cur -> left ,value,res);
//每一层过后将当前的尾部弹出,从而在收集完左侧路径后能够回溯回根节点
value.pop_back();
}
//右侧与左侧同理
if(cur -> right){
traversal(cur -> right,value,res);
value.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> res;
vector<int> value;
traversal(root,value,res);
return res;
}
时间复杂度:O(n)
空间复杂度:O(n)
浙公网安备 33010602011771号