📜  使用递归的二叉树的底视图(1)

📅  最后修改于: 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]