题解 | 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

相关推荐

点赞 评论 收藏
分享
牛客569470950号:也不知道是哪个群体45年前鬼哭狼嚎的为自己争取的被剥削的权利
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务