bfs学习之寻找二叉树每层最大值
来源:互联网 发布:游戏美化软件 编辑:程序博客网 时间:2024/06/08 23:17
LeetCode题目515 Find Largest Value in Each Tree Row
题目:
You need to find the largest value in each row of a binary tree.
Example:
Input:
1 / \ 3 2 / \ \ 5 3 9
Output: [1, 3, 9]
分析
这道题的关键在于将一棵树标识每个节点所在层次。通过bfs遍历,将每个节点的数据和层次记录下来。其中,层次是通过该节点的父节点+1的方法,然后将这些数据存到一个由struct构成的vector,最后通过遍历该vector寻找每层的最大值。这道题的困扰是如何寻找父亲的层次树。如果每个节点的value唯一的话,可以通过遍历vector的key值寻找对应的level,但是这道题并没有太友好,存在着不少节点值相同的情况,所以就不能通过遍历vector的方法。解决的方法是改变之前直接将树节点直接存到队列里面,改成新建一个结构体,里面存储了树节点的所有信息还有它的层次值,然后bfs遍历时直接得到父节点的层次值而不是再遍历vector。另外,在关键词唯一的情况下,这种方法也存在着时间优化的优点,因为不需要另外对vector的O(n^2)的遍历。
代码
using namespace std; struct myNode { int key; int lev; myNode(int x, int y) : key(x), lev(y) {} };struct tmpTreeNode { int key; int lev; TreeNode* left; TreeNode* right; tmpTreeNode() : key(0), lev(0), left(NULL), right(NULL) { }};class Solution { public: int findLevel(vector<myNode*> myVec, int myKey) { for (int i = 0; i < myVec.size(); i++) { if (myVec[i]->key == myKey) return myVec[i]->lev; } return -1; } vector<int> largestValues(TreeNode* root) { vector<int> largestValuesVec; queue<tmpTreeNode> que; vector<myNode*> myLevel; tmpTreeNode newNode; if (root == NULL) return largestValuesVec; newNode.key = root->val; newNode.lev = 1; newNode.left = root->left; newNode.right = root->right; que.push(newNode); myNode* node = new myNode(newNode.key, newNode.lev); myLevel.push_back(node); while (!que.empty()) { tmpTreeNode Top = que.front(); que.pop(); int Level; if (Top.left != NULL) { newNode.key = Top.left->val; newNode.lev = Top.lev + 1; newNode.left = Top.left->left; newNode.right = Top.left->right; que.push(newNode); myNode* node = new myNode(newNode.key, newNode.lev); myLevel.push_back(node); } if (Top.right != NULL) { newNode.key = Top.right->val; newNode.lev = Top.lev + 1; newNode.left = Top.right->left; newNode.right = Top.right->right; que.push(newNode); myNode* node = new myNode(newNode.key, newNode.lev); myLevel.push_back(node); } } int judgeLev = 1; int max = -2147483648 ; for (int i = 0; i < myLevel.size(); i++) { if (myLevel[i]->lev > judgeLev) { largestValuesVec.push_back(max); max = myLevel[i]->key; judgeLev = myLevel[i]->lev; } else if (myLevel[i]->key > max) max = myLevel[i]->key; } largestValuesVec.push_back(max); return largestValuesVec; }};
附
题目地址:https://leetcode.com/problems/find-largest-value-in-each-tree-row/description/
阅读全文
0 0
- bfs学习之寻找二叉树每层最大值
- Leetcode637. BFS计算二叉树每层节点的平均值
- 二叉树中寻找最大值
- 二叉树层级遍历之每层最后一个值
- 计算二叉树每层平均值
- 输出二叉树每层节点数量
- 统计二叉树每层节点个数并打印每层节点
- 分层遍历二叉树,每层输出为一行
- 分层遍历二叉树,每层输出为一行
- 统计二叉树每层节点的个数
- 分层访问二叉树的节点,每层换行
- 面试题之对称的二叉树,层序遍历(每层节点打印成一行),平衡二叉树的判断
- bfs学习之寻找底层最左子树
- 二叉树按层遍历(每层一行)
- 二叉树的创建与遍历&二叉树的高度&二叉树每层结点个数&复制二叉树
- 逐层宽度优先搜索(BFS)二叉树各种解法
- 按层打印二叉树(By BFS)
- 《编程之美》学习笔记——2.10寻找数组中的最大值和最小值
- C++Primer Plus(第六版) 第十六章 第八题
- mock测试
- Spring注解@Component、@Repository、@Service、@Controller区别
- <序列DP>O(nlogn)的最长上升子序列
- 整体二分小结
- bfs学习之寻找二叉树每层最大值
- detect获取到手机型号
- CopyOnWriteArrayList----ReadWriteLock---ConcurrentHashMap
- Combination Sum:非重复数组中选取若干元素求和等于给定值
- Jmeter之处理session、cookie以及如何做关联
- postMessage方法使app内嵌页面跳转原生页面
- MNIST和softmax回归模型
- Increasing Triplet Subsequence
- rollbackFailedOptional: verb npm-session 问题