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会自动排序,切记!

原创粉丝点击