宽度搜索 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(搜索插入位置)
如何使用二分查找算法来解决LeetCode上的“搜索插入位置”问题,确保时间复杂度为O(log n),并提供了详细的代码实现和分析。
15 2
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
20 0
Leetcode第三十三题(搜索旋转排序数组)
|
4月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
4月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
算法 安全 Swift
LeetCode - #33 搜索旋转排序数组(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
索引
leetcode:35.搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
45 0
|
Java C++ 索引
leetcode 33 搜索旋转排序数组
leetcode 33 搜索旋转排序数组
102 0
leetcode 33 搜索旋转排序数组