宽度搜索 leetcode 515

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

示例:

输入: 

          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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值