题解 | JAVA #输出二叉树的右视图# [P2]

输出二叉树的右视图

http://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0

跟精华解法里第二个HashMap的一样思路 JAVA版

类似于用preOrder和inOrder重构一个right-first-preOrder traversal.
https://blog.nowcoder.net/n/983254e186b2484c855622e68136bbc6

在recurse的同时记录当前node的层数,然后print该层第一个visit到的node.
因为是right-first-preOrder, 每层第一个visit的noded就是最右边的node.
import java.util.*;

public class Solution {
 
    public int[] solve (int[] xianxu, int[] zhongxu) {
      if (xianxu.length <= 1) return xianxu;

      int treeSize = xianxu.length;
      // maps level -> rightMostValue
      ArrayList<Integer> ans = new ArrayList<>();
      
      // maps zhongxu的 val -> index
      Map<Integer, Integer> hashM = new HashMap<>();
      for (int i=0; i < treeSize; i++) {
        hashM.put(zhongxu[i], i);
      }
      rec(0, treeSize-1, 0, treeSize-1, 0, xianxu, zhongxu, hashM, ans);
      return ans.stream().mapToInt(i->i).toArray();
    }
  
    // Handles the tree represented by xianxu[xS, xE] and zhongxu[zS, zE].
    void rec(int xS, int xE, int zS, int zE, int level, 
             int[] xianxu, int[] zhongxu, Map<Integer, Integer> hashM,
             ArrayList<Integer> ans) {
      // basecase1
      if (xS > xE) return;
      
      int rootVal = xianxu[xS];
      if (level == ans.size())
        ans.add(rootVal);  // only set ans[level] once.
      
      // basecase2
      if (xS == xE) return;
      
      int zxRootIdx = hashM.get(rootVal);
      int rightSubtreeSize = zE - zxRootIdx;
      int leftSubtreeSize = zxRootIdx - zS;
      
      // 先走right subtree,因为要右视图。
      rec(xE - rightSubtreeSize + 1, xE, zxRootIdx+1, zE, level+1, 
          xianxu, zhongxu, hashM, ans);
      rec(xS+1, xS+leftSubtreeSize, zS, zxRootIdx-1, level+1,
          xianxu, zhongxu, hashM, ans);
    }
}
全部评论
xianxu 前序?
点赞 回复 分享
发布于 2022-08-01 09:05

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务