宽度搜索 leetcode 515

简介: 您需要在二叉树的每一行中找到最大的值。示例:输入: 1 / \ 3 2 / \ \ 5 3 9 输出: [1, 3, 9]思路:层序遍历的基础上,用一个容器存储每层中的元素值。

您需要在二叉树的每一行中找到最大的值。

示例:

输入: 

          1
         / \
        3   2
       / \   \  
      5   3   9 

输出: [1, 3, 9]

思路:层序遍历的基础上,用一个容器存储每层中的元素值。对每层元素值进行排序以获取最大值。时间复杂度O(nlogn)(快排是O(logn),快排嵌套在层序遍历中了,因此是O(nolgn))

vector<int> largestValues(TreeNode* root) {
	vector<int> answer;
	if (root == nullptr) return answer;
	//存储每层节点的值
	vector<int>container;
	queue<TreeNode*> temp;
	temp.push(root);
	int size = 0;
	TreeNode* h = nullptr;
	//层序遍历
	while (!temp.empty()) {
		size = temp.size();
		while (size--) {
			h=temp.front();
			container.push_back(h->val);
			temp.pop();
			if (h->left != nullptr)
				temp.push(h->left);
			if(h->right != nullptr)
				temp.push(h->right);
		}
		//将每层节点值排序
		sort(container.begin(),container.end());
		answer.push_back(container.back());
		container.clear();
	}
	return answer;
}

优化:既然我们存的是每一层最大的值,为什么不直接用一个变量存呢?先存每层第一个节点的值,之后与本层中的其余节点进行比较,将每层的最大值存入数组中返回。这样就省去了把每层的每个值都存起来的空间,也省去的排序浪费的时间。做了这个改变,时间复杂度降为O(n)。

vector<int> largestValues(TreeNode* root) {
	vector<int> answer;
	if (root == nullptr) return answer;
	//存储每层节点第一个节点的值
	int larger = root->val;
	queue<TreeNode*> temp;
	temp.push(root);
	int size = 0;
	TreeNode* h = nullptr;
	//层序遍历
	while (!temp.empty()) {
		size = temp.size();
		//存储每层第一个节点的值
		larger = temp.front()->val;
		while (size--) {
			h = temp.front();
			if (h->val > larger)  larger = h->val;
			temp.pop();
			if (h->left != nullptr)
				temp.push(h->left);
			if (h->right != nullptr)
				temp.push(h->right);
		}
		answer.push_back(larger);
	}
	return answer;
}

相关文章
|
2月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
2月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
2月前
|
算法
LeetCode第35题搜索插入位置
这篇文章介绍了LeetCode第35题"搜索插入位置"的解题方法,通过使用二分查找法,高效地找到在有序数组中插入一个目标数的最佳位置。
LeetCode第35题搜索插入位置
|
5月前
|
C++ 索引 Python
leetcode-35:搜索插入位置
leetcode-35:搜索插入位置
32 0
|
算法 安全 Swift
LeetCode - #33 搜索旋转排序数组(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
算法 安全 Swift
LeetCode - #35 搜索插入位置
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
Java C++ 索引
|
算法 索引
LeetCode:35. 搜索插入位置
题目描述:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。