算法练习----力扣每日一题------3

发布于:2024-04-01 ⋅ 阅读:(64) ⋅ 点赞:(0)

原题链接

331. 验证二叉树的前序序列化 - 力扣(LeetCode)

题目解析

        给一个字符串,判断它是否是一个二叉树的前序遍历.不同元素由逗号隔开,空节点用#字符代替.

递归解法

        先假设每个元素都由一个字符构成(这样可以先不考虑烦人的多个字符情况)

        在接口中调用一个递归函数

//    preorder 原数组
//    pos 下标
//    ret    返回值
//    tmp    用来简单记录一下递归开始的位置
void fun(string& preorder, int& pos, bool& ret, bool tmp = false)

对于preorder[pos]处的递归判断来说        

  1. pos下标不合法                ruturn
  2. preorder[pos] == '#'        空节点,不需要再往下执行,直接return
  3. preorder[pos] 是数字      调用两次fun检测左右子树
  4. preorder[pos] == ','         按照假设这种情况有办法避免,可以不出现,不考虑

运行结束后,在递归执行的入口处如果pos等于数组长度-1,证明成立,否则不成立.

void fun(string& preorder, int& pos, bool& ret, bool tmp = false)
{
	if (pos >= preorder.size())
	{
		ret = false;
		return;
	}
	if (preorder[pos] == '#')
		return;
	fun(preorder, pos += 2, ret);
	fun(preorder, pos += 2, ret);

	if (tmp == true && pos == preorder.size() - 1)
		ret = true;

}

将多字符元素转化成单子符元素,这个比较简单就不多说了

全部代码

class Solution {
public:
	void fun(string& preorder, int& pos, bool& ret, bool tmp = false)
	{
		if (pos >= preorder.size())
		{
			ret = false;
			return;
		}
		if (preorder[pos] == '#')
			return;
		fun(preorder, pos += 2, ret);
		fun(preorder, pos += 2, ret);

		if (tmp == true && pos == preorder.size() - 1)
			ret = true;

	}
	bool fun2(char x)
	{
		return x >= '0' && x <= '9';
	}
	bool isValidSerialization(string preorder) {
		bool ret = false;
		int pos = 0;
		string tmp;
		if (preorder == "#")
			return true;
		char c1 = 0;
		for (auto e : preorder)
		{
			if (fun2(e) && fun2(c1))
				continue;
			else {
				tmp.push_back(e);
				c1 = e;
			}
		}
		fun(tmp, pos, ret, true);
		return ret;

	}
};

感谢观看!!!!!

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到