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
原创粉丝点击