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; }
相关推荐
javascript js_leetcode题解之94-binary-tree-inorder-traversal.js
java java_leetcode-107-binary-tree-level-order-traversal
java java_leetcode-102-binary-tree-level-order-traversal
这个压缩包文件"Pre-order-binary-tree-traversal.rar_pre_pre-orderC语言"显然是为了教授如何使用C语言进行二叉树的前序遍历。下面将详细介绍前序遍历的概念、算法以及C语言实现的关键点。 1. **前序遍历的概念**...
javascript js_leetcode题解之145-binary-tree-postorder-traversal.js
javascript js_leetcode题解之144-binary-tree-preorder-traversal.js
js js_leetcode题解之102-binary-tree-level-order-traversal.js
js js_leetcode题解之107-binary-tree-level-order-traversal-ii.js
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.doc"文档中,可能会详细探讨这些概念并给出具体的代码示例,包括如何实现这些遍历方法以及在不同场景下如何选择合适的二叉树结构。通过学习和理解这些内容,开发者能够更好地...
js js_leetcode题解之103-binary-tree-zigzag-level-order-traversal.js
Construct Binary Tree from Preorder and Inorder Traversal 根据先序,中序建立二叉树
BinaryTree-BinaryTree
"Python-BinaryTree"是一个专门用于学习和操作二叉树的Python库,它提供了方便的API来创建、遍历和操作二叉树。 1. **二叉树的概念与类型** - 二叉树的基本概念:二叉树的每个节点包含一个值、一个指向左子树的...
python python_leetcode题解之094_Binary_Tree_Inorder_Traversal
c语言基础 c语言_leetcode题解之0094_binary_tree_inorder_traversal.zip
完全二叉树是一种特殊的二叉树结构,每个层(除了可能的最后一层)都是完全填充的,且所有结点都尽可能地集中在左侧。在完全二叉树中,如果最后一个层是不完全填充的,则所有结点都集中在左端。...
标题"C#资源库-binarytree"指的是一个使用C#编程语言实现的二叉树数据结构的代码库。在软件开发中,二叉树是一种基础且重要的数据结构,它由节点构成,每个节点最多有两个子节点,通常称为左子节点和右子节点。这种...
python python_leetcode题解之145_Binary_Tree_Postorder_Traversal
python python_leetcode题解之144_Binary_Tree_Preorder_Traversal