`

FaceBook Interview - Binary Tree Vertical Traversal

 
阅读更多

Given a binary tree, traverse it vertically.

For example:

     5 
   /   \
  2     7
 / \   / \
1   3 6   8
     \     \
      4     9

 

Should return as:

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

 

Solution 1:

递归前序遍历,直接用vector或者ArrayList来保存结果。

/* 
struct TreeNode { 
    TreeNode(int v = 0) :val(v){} 
    int val{ 0 }; 
    TreeNode* left{ nullptr }; 
    TreeNode* right{ nullptr }; 
}; 
*/  
void preorder(vector<vector<int>>& res, TreeNode* node, int col, int& left, int& right) {  
    if(!node) return;  
    if(col < left) {  
        left = col;  
        res.insert(res.begin(),vector<int>(1,node->val));  
    } else if(col > right) {  
        right = col;  
        res.push_back(vector<int>(1,node->val));  
    } else {  
        res[col-left].push_back(node->val);  
    }  
    preorder(res, node->left, col-1, left, right);  
    preorder(res, node->right, col+1, left, right);  
}  
  
vector<vector<int>> vertical_traversal(TreeNode* root) {  
    vector<vector<int>> res;  
    if(!root) return res;  
    int left = 0, right = 0;  
    res.push_back(vector<int>());  
    preorder(res, root, 0, left, right);  
    return res;  
}  

 

Solution 2:

使用HashMap递归前序遍历,然后按照key的大小依次取出值。

void hash_preorder(unordered_map<int, vector<int>>& map, TreeNode *node, int col, int& left, int& right) {
    if(!node) return;
    left = min(col, left);
    right = max(col, right);
    map[col].push_back(node->val);
    hash_preorder(map, node->left, col-1, left, right);
    hash_preorder(map, node->right, col+1, left, right);
}

vector<vector<int>> vertical_traversal(TreeNode* root) {
    vector<vector<int>> res;
    if(!root) return res;
    int left = 0, right = 0;
    unordered_map<int, vector<int>> map;
    hash_preorder(map, root, 0, left, right);
    for(int i=left; i<=right; i++) res.push_back(map[i]);
    return res;
}

 

Solution 3:

但是上面两种方法都不能保证从上往下看的顺序。所以要保证从上到下的顺序的话,需要用BFS即Level Order的方法来遍历。用pair<int, TreeNode*>来保存index和节点指针。

vector<vector<int>> vertical_traversal(TreeNode* root) {
    vector<vector<int>> res;
    if(!root) return res;
    unordered_map<int, vector<int>> map;
    queue<pair<int, TreeNode*>> queue;
    queue.emplace(0, root);
    int left=0, right=0;
    while(!queue.empty()) {
        auto& p = queue.front();
        queue.pop();
        left = min(left, p.first);
        right = max(right, p.first);
        map[p.first].push_back(p.second->val);
        if(p.second->left) 
            queue.emplace(p.first-1, p.second->left);
        if(p.second->right) 
            queue.emplace(p.first+1, p.second->right);
    }
    for(int i=left; i<=right; i++) 
        res.push_back(map[i]);
    return res;
}

 

分享到:
评论

相关推荐

    java-leetcode-107-binary-tree-level-order-traversal

    java java_leetcode-107-binary-tree-level-order-traversal

    java-leetcode-102-binary-tree-level-order-traversal

    java java_leetcode-102-binary-tree-level-order-traversal

    Pre-order-binary-tree-traversal.rar_pre_pre-orderC语言

    这个压缩包文件"Pre-order-binary-tree-traversal.rar_pre_pre-orderC语言"显然是为了教授如何使用C语言进行二叉树的前序遍历。下面将详细介绍前序遍历的概念、算法以及C语言实现的关键点。 1. **前序遍历的概念**...

    c语言-leetcode题解之0094-binary-tree-inorder-traversal.zip

    c语言-leetcode题解之0094-binary-tree-inorder-traversal.zip文件将为C语言学习者提供一次深入理解中序遍历算法并实践C语言编码的宝贵机会,尤其适合那些希望通过实际问题来提高编程技能的开发者。

    amoeba-mysql-binary-2.2.0.tar.gz

    amoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.2.0.tar.gzamoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.2.0.tar.gz ...

    binary-tree-traversal-binary-tree.zip_tree

    在"binary tree traversal binary tree.doc"文档中,可能会详细探讨这些概念并给出具体的代码示例,包括如何实现这些遍历方法以及在不同场景下如何选择合适的二叉树结构。通过学习和理解这些内容,开发者能够更好地...

    Construct Binary Tree from Preorder and Inorder Traversal

    Construct Binary Tree from Preorder and Inorder Traversal 根据先序,中序建立二叉树

    BinaryTree-BinaryTree

    BinaryTree-BinaryTree

    Python-BinaryTree用于学习二叉树的Python库

    "Python-BinaryTree"是一个专门用于学习和操作二叉树的Python库,它提供了方便的API来创建、遍历和操作二叉树。 1. **二叉树的概念与类型** - 二叉树的基本概念:二叉树的每个节点包含一个值、一个指向左子树的...

    complete-binary-tree--traversal.zip_最小完全树

    完全二叉树是一种特殊的二叉树结构,每个层(除了可能的最后一层)都是完全填充的,且所有结点都尽可能地集中在左侧。在完全二叉树中,如果最后一个层是不完全填充的,则所有结点都集中在左端。...

    js-leetcode题解之94-binary-tree-inorder-traversal.js

    在LeetCode上,问题编号94的题目“Binary Tree Inorder Traversal”就是要求对给定的二叉树进行中序遍历,并返回遍历的结果。给定的二叉树用JavaScript对象来表示,每个节点的值为一个数字,节点结构包含值、左子...

    C#资源库-binarytree

    标题"C#资源库-binarytree"指的是一个使用C#编程语言实现的二叉树数据结构的代码库。在软件开发中,二叉树是一种基础且重要的数据结构,它由节点构成,每个节点最多有两个子节点,通常称为左子节点和右子节点。这种...

    js-leetcode题解之107-binary-tree-level-order-traversal-ii.js

    通过LeetCode题解的这个文件“js-leetcode题解之107-binary-tree-level-order-traversal-ii.js”,我们可以学习如何使用JavaScript编写二叉树层序遍历的变种,以及如何处理和操作队列数据结构。

    python-leetcode题解之094-Binary-Tree-Inorder-Traversal

    在计算机科学中,二叉树是一种重要的数据结构,尤其在编程算法和数据组织方面发挥着关键作用。在二叉树中,节点最多有两个子节点,分别被称为左子节点和右子节点。中序遍历是一种递归遍历二叉树的算法,它按照左-根-...

    js-leetcode题解之144-binary-tree-preorder-traversal.js

    对于LeetCode上编号为144的题目“Binary Tree Preorder Traversal”,我们可以采用递归或非递归的方式来解决。 首先,递归方法是前序遍历实现中最直观的一种。在递归函数中,我们首先将根节点的值添加到结果数组中...

    python-leetcode题解之107-Binary-Tree-Level-Order-Traversal-II

    2. 在LeetCode平台上,问题编号107的题目是“Binary Tree Level Order Traversal II”,它要求对给定的二叉树进行反向层级遍历,即从最后一层到第一层的顺序输出节点值。 3. 反向层级遍历算法可以通过先进行正常的...

    python-leetcode题解之102-Binary-Tree-Level-Order-Traversal

    由于LeetCode平台提供了一个公共的编程问题库供开发者练习和提升编程能力,因此我们选择了其中的题目编号102,即"Binary Tree Level Order Traversal"(二叉树的层序遍历)。为了解决这个问题,我们通常需要掌握队列...

    python-leetcode题解之144-Binary-Tree-Preorder-Traversal

    在对二叉树进行前序遍历的过程中,首先需要了解前序遍历的基本概念。前序遍历是一种深度优先遍历二叉树的方法,按照“根节点 - 左子树 - 右子树”的顺序访问每个节点。在编写Python代码解决LeetCode上144题时,我们...

    python-leetcode题解之145-Binary-Tree-Postorder-Traversal

    在计算机科学中,二叉树是一种重要的数据结构,用于模拟具有层次关系的数据。在二叉树中,每个节点最多有两个子节点,称为左子节点和右子节点。后序遍历是遍历二叉树的三种主要方式之一,其他两种是前序遍历和中序...

    python-leetcode题解之103-Binary-Tree-Zigzag-Level-Order-Traversal

    今天我们将详细讨论Python实现LeetCode第103题——二叉树的锯齿形层序遍历(Binary Tree Zigzag Level Order Traversal)的解决方案。 二叉树的锯齿形层序遍历要求我们以不同于传统层序遍历的方式输出树节点值,即...

Global site tag (gtag.js) - Google Analytics