leetcode 257二叉树的所有路径

题目:https://leetcode-cn.com/problems/binary-tree-paths/

思路一:递归
分析; 在这道题目中涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一一个路径在进入另一个路径。用前序遍历,将根节点入数组,直到遇到叶子节点,这样一条路径被保存在了数组;然后将这条路径的节点转换成字符串,并保存进一个字符串数组,回溯一个路径,进入另外一条路径。
前序遍历的过程:

步骤:递归
1、函数参数和返回值
函数的参数输入的是节点,数组(path存储每一条路径的节点),数组(字符串数组,存储结果);返回值为字符串数组
2、终止条件
如果结点的左右子树是空节点,则定义一个字符串,(path里面存储的是条路经的节点),将path里面的每个整型数字转换成字符串,将字符串入数组
3、如果左子树存在,则递归,path抛出一个元素,实现回溯
4、如果右子树存在,则递归 ,path抛出一个元素,实现回溯

void traversal(TreeNode* cur, vector<int>& path, vector<string>& result)
   {
       path.push_back(cur->val);
       //终止的条件
       if(cur->left==NULL&&cur->right==NULL)
       {
            string spath;
            for(int i=0;i<path.size()-1;i++)
            {
                spath+=to_string(path[i]);
                spath+="->";
            }
            spath+=to_string(path[path.size()-1]);
            result.push_back(spath);
            spath.clear();
            return ;
       }
       if(cur->left)
       {
           traversal(cur->left,path,result);
           path.pop_back();//回溯
       }
        if(cur->right)
       {
           traversal(cur->right,path,result);
           path.pop_back();//回溯
       }
       
    }
   
   
    vector<string> binaryTreePaths(TreeNode* root)
    {


         vector<string> result;
         vector<int> path;
         if(root==NULL)
         return result;
        traversal(root,path,result);
        return result;
    }

思路二:迭代法
广度优先遍历,定义两个队列,一个用于存储节点,一个用于存储路径;将根节点入队列,,一开始只有根节点,将队列队首元素弹出,如果他是叶子节点,则将他加入到对应的路径当中,如果它不是叶子节点,则将他的所有孩子节点加入到队列的尾部,当队列为空时,广度优先搜索结束。
步骤:
1、定义一个字符串数组,用于保存结果,定义两个队列,一个用于保存节点,一个用于保存每条路径。
2、如果节点是那个空,就返回。如果不为空。就将根节点入两个队列(一个队列存储节点,一个存储路径)
3、将节点抛出,路径抛出,(节点和它所在的路径在两个队列中存储的位置相同)
4、 如果节点的左右子树不存在,将路径加入到结果数组里面
5、 如果左子树存在,则节点的左子树入队列,然后将“-》”+节点数值加入到路径队列中,右子树存在,操作相同;
6、循环结束后,将结果数组抛出

vector<string> binaryTreePaths(TreeNode* root)
    {
        vector<string>vec;


       queue<TreeNode*>node_que;
       queue<string>result_que;
       if(root==NULL)
       return vec;
       node_que.push(root);
       result_que.push(to_string(root->val));
       while(!node_que.empty())
       {
          
          TreeNode*node=node_que.front();
          string paths=result_que.front();
           node_que.pop();
           result_que.pop();
           if(node->left==NULL&&node->right==NULL)
           {
               vec.push_back(paths);
           }
          else
             {
                 if(node->left)
                {
                    node_que.push(node->left);
                    
                    result_que.push(paths+"->"+to_string(node->left->val));
                }
           if(node->right)
           {
               node_que.push(node->right);
               result_que.push(paths+"->"+to_string(node->right->val));
           }
             }
       }
       return vec;
    }



     
         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值