• Binary Tree Vertical Order Traversal -- LeetCode


    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bottom, column by column).

    If two nodes are in the same row and column, the order should be from left to right.

    Examples:

     

    Given binary tree [3,9,20,null,null,15,7],

       3
      /
     /  
     9  20
        /
       /  
      15   7

    return its vertical order traversal as:

    [
      [9],
      [3,15],
      [20],
      [7]
    ]

    Given binary tree [3,9,8,4,0,1,7],

         3
        /
       /  
       9   8
      /  /
     /  /  
     4  01   7

    return its vertical order traversal as:

    [
      [4],
      [9],
      [3,0,1],
      [8],
      [7]
    ]

    Given binary tree [3,9,8,4,0,1,7,null,null,null,2,5] (0's right child is 2 and 1's left child is 5),

         3
        /
       /  
       9   8
      /  /
     /  /  
     4  01   7
        /
       /  
       5   2

    return its vertical order traversal as:

    [
      [4],
      [9,5],
      [3,0,1],
      [8,2],
      [7]
    ]

    思路:bsf。然后用链表暂时存储结果。假设当前链表节点的iterator为it,则它的前一个节点的iterator可以用std::prev(it, 1)获得,它的下一个节点的iterator可以用std::next(it, 1)获得。

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<vector<int>> verticalOrder(TreeNode* root) {
    13         vector<vector<int> > res;
    14         if (root == NULL) return res;
    15         list<vector<int> > columns;
    16         queue<TreeNode*> nodes;
    17         queue<list<vector<int> >::iterator> iterators;
    18         columns.push_back(vector<int>(1, root->val));
    19         nodes.push(root);
    20         iterators.push(columns.begin());
    21         while (!nodes.empty()) {
    22             TreeNode* cur = nodes.front(); nodes.pop();
    23             auto it = iterators.front(); iterators.pop();
    24             if (cur->left) {
    25                 if (it == columns.begin()) columns.push_front(vector<int>(1, cur->left->val));
    26                 else std::prev(it, 1)->push_back(cur->left->val);
    27                 nodes.push(cur->left);
    28                 iterators.push(std::prev(it, 1));
    29             }
    30             if (cur->right) {
    31                 if (std::next(it, 1) == columns.end()) columns.push_back(vector<int>(1, cur->right->val));
    32                 else std::next(it, 1)->push_back(cur->right->val);
    33                 nodes.push(cur->right);
    34                 iterators.push(std::next(it, 1));
    35             }
    36         }
    37         for (auto it = columns.begin(); it != columns.end(); it++)
    38             res.push_back(*it);
    39         return res;
    40     }
    41 };
  • 相关阅读:
    蜕变过程中的思考
    Django template for 循环用法
    Django 发送html邮件
    Django F对象的使用
    在Django中使用Q()对象
    ubuntu中管理用户和用户组
    Django settings.py 的media路径设置
    Git版本控制 备忘录
    Git .gitignore文件的使用
    将git关联到pycharm
  • 原文地址:https://www.cnblogs.com/fenshen371/p/5801658.html
Copyright © 2020-2023  润新知