📅  最后修改于: 2023-12-03 15:06:59.496000             🧑  作者: Mango
在二叉树中,底视图是二叉树从下往上看时,最后一层节点的值构成的序列。
使用递归的方式可以很方便地得到二叉树的底视图。
假设当前节点的深度为 depth
,如果当前节点是底视图上首次出现的节点,则将其值加入底视图。如果当前节点的深度大于等于该深度,那么将该节点的值替换为底视图上该位置的节点的值。
具体实现可以使用 HashMap 存储每个深度上的节点值,从左到右遍历二叉树的每个节点,当到达每一层最右边的节点时,将其加入底视图。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public class BinaryTreeBottomView {
Map<Integer, Integer> map = new HashMap<>();
int leftMost = 0, rightMost = 0;
public List<Integer> bottomView(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) return res;
traverse(root, 0, 0);
for (int i = leftMost; i <= rightMost; i++) {
res.add(map.get(i));
}
return res;
}
private void traverse(TreeNode node, int depth, int horizontal) {
if (node == null) return;
if (!map.containsKey(horizontal) || depth >= map.get(horizontal)) {
map.put(horizontal, node.val);
if (depth > rightMost) rightMost = depth;
if (depth < leftMost) leftMost = depth;
}
traverse(node.left, depth + 1, horizontal - 1);
traverse(node.right, depth + 1, horizontal + 1);
}
}
1
/ \
2 3
/ \ / \
4 5 6 7
\
8
[4, 2, 6, 3, 8]
底视图上的节点值为 [4, 2, 6, 3, 8]
。