Leetcode--257 二叉树的所有路径

本文探讨了如何求解二叉树中从根节点到所有叶子节点的路径,并提供了两种解决方案:一种是利用回溯算法,另一种是通过不断开辟分支的方法。文章详细介绍了每种方法的实现过程和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

示例:

输入:

   1
 /   \
2     3
 \
  5

输出: ["1->2->5", "1->3"]

解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3

 

首先要写一下我自己的错误的思路:利用回溯,到了叶子结点后将当前遍历到的一位数组加入到要返回的二维数组中,当然最后因为题目要求输出的是上边的链表形式,所以我们再重新格式化一下(比较麻烦),代码如下:

class Solution {
public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string>res;
		string path;
		
		//特殊情况
		if (!root) {
			return res;
		}
		
		helper(res, path, root);
		reFormat(res);

		return res;
    }
    
   void helper(vector<string>&res, string &path,TreeNode *root) {
		if (!root) {
			return;
		}
		path += root->val + '0';

		if (!root->left && !root->right) {
			res.push_back(path);
		}

		helper(res, path, root->left);
		helper(res, path, root->right);

		path.pop_back();
	}

	//转化为要求的格式
	void reFormat(vector<string>&res) {
		for (int i = 0;i < res.size();i++) {
			res[i] = Try(res[i]);
		}
	}
    
    //单个字符串的转换
	string Try(string s) {
		vector<string>tmp;
		string res;
		for (int i = 0;i < s.size();i++) {
			string t;
			t.push_back(s[i]);
			t += "->";
			tmp.push_back(t);
		}
		for (int i = 0;i < tmp.size();i++) {
			res += tmp[i];
		}

		return res.substr(0, res.size() - 2);
	}
};

简单的样例都跑过了,但无奈submit后显示207/209 cases通过,希望有懂的帮忙看一下是哪里出了漏洞。

 

下面是参考的别人的解法,重点是不需要回溯,而是不断的开辟分支(因为若给出两个路径,如果一旦其中有一个节点不同,那么它们两个就是不同的),我们从根节点开始,如果遇到了叶子结点就只加上当前节点并将一维数组压入,否则遍历左右子树,并加入 node->val+"->",简洁易懂,代码如下:

class Solution {
public:
    vector<string> binaryTreePaths(TreeNode* root) {
      vector<string>res;
		
		//特殊情况
		if (!root) {
			return res;
		}
		helper(res, "", root);
		
		return res;
    }
    
    void helper(vector<string>&res,string path,TreeNode *node){
		if (!node->left && !node->right) {
			path += to_string(node->val);
			res.push_back(path);
		}
		if (node->left) {
			helper(res, path + to_string(node->val) + "->", node->left);
		}
		if (node->right) {
			helper(res, path + to_string(node->val) + "->", node->right);
		}


	}
    
  
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值