987:二叉树的垂序遍历
This commit is contained in:
parent
597448a9fc
commit
310e2f7956
@ -0,0 +1,137 @@
|
||||
//给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。
|
||||
//
|
||||
// 对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1) 。树的
|
||||
//根结点位于 (0, 0) 。
|
||||
//
|
||||
// 二叉树的 垂序遍历 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则
|
||||
//按结点的值从小到大进行排序。
|
||||
//
|
||||
// 返回二叉树的 垂序遍历 序列。
|
||||
//
|
||||
//
|
||||
//
|
||||
// 示例 1:
|
||||
//
|
||||
//
|
||||
//输入:root = [3,9,20,null,null,15,7]
|
||||
//输出:[[9],[3,15],[20],[7]]
|
||||
//解释:
|
||||
//列 -1 :只有结点 9 在此列中。
|
||||
//列 0 :只有结点 3 和 15 在此列中,按从上到下顺序。
|
||||
//列 1 :只有结点 20 在此列中。
|
||||
//列 2 :只有结点 7 在此列中。
|
||||
//
|
||||
// 示例 2:
|
||||
//
|
||||
//
|
||||
//输入:root = [1,2,3,4,5,6,7]
|
||||
//输出:[[4],[2],[1,5,6],[3],[7]]
|
||||
//解释:
|
||||
//列 -2 :只有结点 4 在此列中。
|
||||
//列 -1 :只有结点 2 在此列中。
|
||||
//列 0 :结点 1 、5 和 6 都在此列中。
|
||||
// 1 在上面,所以它出现在前面。
|
||||
// 5 和 6 位置都是 (2, 0) ,所以按值从小到大排序,5 在 6 的前面。
|
||||
//列 1 :只有结点 3 在此列中。
|
||||
//列 2 :只有结点 7 在此列中。
|
||||
//
|
||||
//
|
||||
// 示例 3:
|
||||
//
|
||||
//
|
||||
//输入:root = [1,2,3,4,6,5,7]
|
||||
//输出:[[4],[2],[1,5,6],[3],[7]]
|
||||
//解释:
|
||||
//这个示例实际上与示例 2 完全相同,只是结点 5 和 6 在树中的位置发生了交换。
|
||||
//因为 5 和 6 的位置仍然相同,所以答案保持不变,仍然按值从小到大排序。
|
||||
//
|
||||
//
|
||||
//
|
||||
// 提示:
|
||||
//
|
||||
//
|
||||
// 树中结点数目总数在范围 [1, 1000] 内
|
||||
// 0 <= Node.val <= 1000
|
||||
//
|
||||
// Related Topics 树 深度优先搜索 广度优先搜索 哈希表 二叉树
|
||||
// 👍 124 👎 0
|
||||
|
||||
package leetcode.editor.cn;
|
||||
|
||||
import com.code.leet.entiy.TreeNode;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
//987:二叉树的垂序遍历
|
||||
public class VerticalOrderTraversalOfABinaryTree {
|
||||
public static void main(String[] args) {
|
||||
//测试代码
|
||||
Solution solution = new VerticalOrderTraversalOfABinaryTree().new Solution();
|
||||
}
|
||||
//力扣代码
|
||||
//leetcode submit region begin(Prohibit modification and deletion)
|
||||
|
||||
/**
|
||||
* Definition for a binary tree node.
|
||||
* public class TreeNode {
|
||||
* int val;
|
||||
* TreeNode left;
|
||||
* TreeNode right;
|
||||
* TreeNode() {}
|
||||
* TreeNode(int val) { this.val = val; }
|
||||
* TreeNode(int val, TreeNode left, TreeNode right) {
|
||||
* this.val = val;
|
||||
* this.left = left;
|
||||
* this.right = right;
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
class Solution {
|
||||
List<int[]> list = new ArrayList<>();
|
||||
|
||||
public List<List<Integer>> verticalTraversal(TreeNode root) {
|
||||
dfs(root, 0, 0);
|
||||
list.sort((a, b) -> {
|
||||
if (a[0] != b[0]) {
|
||||
return a[0] - b[0];
|
||||
}
|
||||
if (a[1] != b[1]) {
|
||||
return a[1] - b[1];
|
||||
}
|
||||
return a[2] - b[2];
|
||||
});
|
||||
int size = list.size();
|
||||
List<List<Integer>> result = new ArrayList<>();
|
||||
List<Integer> temp = new ArrayList<>();
|
||||
temp.add(list.get(0)[2]);
|
||||
int col = list.get(0)[0];
|
||||
for (int i = 1; i < size; i++) {
|
||||
while (i < size && list.get(i)[0] == col) {
|
||||
temp.add(list.get(i)[2]);
|
||||
i++;
|
||||
}
|
||||
if (i == size) {
|
||||
break;
|
||||
}
|
||||
result.add(temp);
|
||||
temp = new ArrayList<>();
|
||||
temp.add(list.get(i)[2]);
|
||||
col = list.get(i)[0];
|
||||
}
|
||||
result.add(temp);
|
||||
return result;
|
||||
}
|
||||
|
||||
private void dfs(TreeNode root, int row, int col) {
|
||||
list.add(new int[]{col, row, root.val});
|
||||
if (root.left != null) {
|
||||
dfs(root.left, row + 1, col - 1);
|
||||
}
|
||||
if (root.right != null) {
|
||||
dfs(root.right, row + 1, col + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
//leetcode submit region end(Prohibit modification and deletion)
|
||||
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
<p>给你二叉树的根结点 <code>root</code> ,请你设计算法计算二叉树的<em> </em><strong>垂序遍历</strong> 序列。</p>
|
||||
|
||||
<p>对位于 <code>(row, col)</code> 的每个结点而言,其左右子结点分别位于 <code>(row + 1, col - 1)</code> 和 <code>(row + 1, col + 1)</code> 。树的根结点位于 <code>(0, 0)</code> 。</p>
|
||||
|
||||
<p>二叉树的 <strong>垂序遍历</strong> 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。</p>
|
||||
|
||||
<p>返回二叉树的 <strong>垂序遍历</strong> 序列。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
<img alt="" src="https://assets.leetcode.com/uploads/2021/01/29/vtree1.jpg" style="width: 431px; height: 304px;" />
|
||||
<pre>
|
||||
<strong>输入:</strong>root = [3,9,20,null,null,15,7]
|
||||
<strong>输出:</strong>[[9],[3,15],[20],[7]]
|
||||
<strong>解释:</strong>
|
||||
列 -1 :只有结点 9 在此列中。
|
||||
列 0 :只有结点 3 和 15 在此列中,按从上到下顺序。
|
||||
列 1 :只有结点 20 在此列中。
|
||||
列 2 :只有结点 7 在此列中。</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
<img alt="" src="https://assets.leetcode.com/uploads/2021/01/29/vtree2.jpg" style="width: 512px; height: 304px;" />
|
||||
<pre>
|
||||
<strong>输入:</strong>root = [1,2,3,4,5,6,7]
|
||||
<strong>输出:</strong>[[4],[2],[1,5,6],[3],[7]]
|
||||
<strong>解释:</strong>
|
||||
列 -2 :只有结点 4 在此列中。
|
||||
列 -1 :只有结点 2 在此列中。
|
||||
列 0 :结点 1 、5 和 6 都在此列中。
|
||||
1 在上面,所以它出现在前面。
|
||||
5 和 6 位置都是 (2, 0) ,所以按值从小到大排序,5 在 6 的前面。
|
||||
列 1 :只有结点 3 在此列中。
|
||||
列 2 :只有结点 7 在此列中。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 3:</strong></p>
|
||||
<img alt="" src="https://assets.leetcode.com/uploads/2021/01/29/vtree3.jpg" style="width: 512px; height: 304px;" />
|
||||
<pre>
|
||||
<strong>输入:</strong>root = [1,2,3,4,6,5,7]
|
||||
<strong>输出:</strong>[[4],[2],[1,5,6],[3],[7]]
|
||||
<strong>解释:</strong>
|
||||
这个示例实际上与示例 2 完全相同,只是结点 5 和 6 在树中的位置发生了交换。
|
||||
因为 5 和 6 的位置仍然相同,所以答案保持不变,仍然按值从小到大排序。</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li>树中结点数目总数在范围 <code>[1, 1000]</code> 内</li>
|
||||
<li><code>0 <= Node.val <= 1000</code></li>
|
||||
</ul>
|
||||
<div><div>Related Topics</div><div><li>树</li><li>深度优先搜索</li><li>广度优先搜索</li><li>哈希表</li><li>二叉树</li></div></div>\n<div><li>👍 124</li><li>👎 0</li></div>
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user