bfs学习之寻找底层最左子树
来源:互联网 发布:sap hana sql 编辑:程序博客网 时间:2024/05/14 07:52
LeetCode题目513 Find Bottom Left Tree Value
题目:
Given a binary tree, find the leftmost value in the last row of the tree.
Example 1:
Input:
2 / \1 3
Output:
1
Note: You may assume the tree (i.e., the given root node) is not NULL.
分析
这道题类似于层次二叉树,将已有的树按照每层的节点按照从左到右的顺序排序,用bfs的算法不难做出,就是按照普通的bfs算法,用一个队列作为存储介质。先把树的根节点存进去,然后在一个循环里面将队头的节点访问一遍,记录该节点的信息,然后将它弹出。再判断它是否有左右孩子,如果存在,则将它们加进队列。然后再用一个vector来存储该儿子节点的value和它的level,儿子节点是通过父亲的level加1,所以要另外一个函数去寻找它们的父节点的level值。如此循环下去直到该树被完全访问一遍,所有的节点的value和level。最后要寻找底层最左边的节点值,只需要将之前已经存有value和level的vector从后往前遍历。因为vector是按照层次排好序的,所以将最后一个记为最大的level,当往前遍历时发现该节点比最大level小的话,该节点的紧接着的后一个节点值就是底层最左边的节点值。
代码
struct myNode { int key; int lev; myNode(int x, int y) : key(x), lev(y) {} }; using namespace std; 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; } int findBottomLeftValue(TreeNode* root) { queue<TreeNode*> que; vector<myNode*> myLevel; que.push(root); myNode* node = new myNode(root->val, 1); myLevel.push_back(node); while (!que.empty()) { TreeNode* Top = que.front(); que.pop(); int Level; if (Top->left != NULL) { que.push(Top->left); Level = findLevel(myLevel, Top->val) + 1; myNode* node = new myNode(Top->left->val, Level); myLevel.push_back(node); } if (Top->right != NULL) { que.push(Top->right); Level = findLevel(myLevel, Top->val) + 1; myNode* node = new myNode(Top->right->val, Level); myLevel.push_back(node); } } if (myLevel.size() != 0) { if (myLevel.size() == 1) return myLevel[0]->key; int i = myLevel.size()-1; int leftTree = myLevel[i]->key; int maxLevel = myLevel[i]->lev; while (i != 0) { i--; if (myLevel[i]->lev < maxLevel) return leftTree; else leftTree = myLevel[i]->key; } return leftTree; } }};
注意点
这道题在记录节点值和level时,很容易想到用map来存储会比较方便。我一开始就是这么实现的,然后发现整个思路下来没有任何问题,但是提交上去就是不对,在百思不得起解的时候查了一下是不是insert用错了,insert的位置不对,然后加了迭代器规定插入的位置一定是map的最末端,重新提交后还是不对。后来自己写测试代码检验,突然发现map和set这两个东西居然擅自将顺序按照关键词排好序了,无论你插入到哪个位置,它都会自动帮你排好序了,气死!怪不得按照往前找level < maxLevel 这种方法不对。所以还是自己定义数据结构,在用vector存储,才搞定!重复一遍,map和set会自动排序,切记!
- bfs学习之寻找底层最左子树
- 寻找子树
- 寻找最短路径BFS
- bfs学习之寻找二叉树每层最大值
- hdoj1072 Nightmare(bfs寻找最短时间)
- bfs之——寻找多个目的地的最短路
- bfs寻找最短路径并且打印路径和方向
- 交换二叉树的左子树和右子树
- 寻找左兄弟节点
- Android学习之 底层_FramWork_SystemUI_Statusbar
- Android底层学习之开篇
- Google:寻找你的世界之最
- 广搜之寻找最短路径
- 寻找子树和子孙树 ,家谱树
- 寻找节点和最大的子树
- 编译原理之最左推导和最右推导
- 小白书之迷宫最短路径bfs
- 迷宫问题之最短路径bfs
- spring mvc入门
- 232电平与TTL电平
- Servlet入门
- POJ 3468 A Simple Problem with Integers (Splay 区间更新、区间求和)
- 块级元素与内联元素总结
- bfs学习之寻找底层最左子树
- ha
- 换行和回车
- Git学习记录<3>
- java多线程的生命周期
- SYNCookie原理
- 【整体二分+二维树状数组】BZOJ2738 矩阵乘法
- Spring Aop FirstDemo
- 一文读懂卷积神经网络