BM41 题解 | #输出二叉树的右视图#
输出二叉树的右视图
https://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0
看见进步:
真棒,Good job! 这次是自己做出整个二叉树的最后一道题目了,都是前面所有的题目,积累的知识厚积薄发,带来的效果,真棒!真棒!真棒!棒棒棒!
解题思路:
1、用BM40的思路,重构二叉树
2、用层次遍历的方法,获得最有子节点
import java.util.*; public class Solution { /* * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve (int[] preOrder, int[] inOrder) { TreeNode root = deConstructTreeNode(preOrder,inOrder); ArrayList<Integer> res = getSloveArray(root); int[] resArr = res.stream().mapToInt(i->i).toArray(); return resArr; } /** * 层次遍历整个二叉树,获得最后一个节点 */ public ArrayList<Integer> getSloveArray(TreeNode root) { ArrayList<Integer> res = new ArrayList<Integer>(); if(root == null) { return res; } ArrayDeque<TreeNode> q = new ArrayDeque<>(); q.offer(root); while(!q.isEmpty()) { int n = q.size(); for(int i=0; i<n; i++) { TreeNode node = q.poll(); if(i== n-1) { res.add(node.val); } if(node.left!=null) { q.offer(node.left); } if(node.right!=null) { q.offer(node.right); } } } return res; } public TreeNode deConstructTreeNode(int[] pre, int[] vin) { int m = pre.length; int n = vin.length; if(m ==0 || n == 0) { return null; } TreeNode root = new TreeNode(pre[0]); for(int i=0; i<n; i++) { if(pre[0] == vin[i]) { root.left = deConstructTreeNode( Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(vin, 0, i) ); root.right = deConstructTreeNode( Arrays.copyOfRange(pre, i+1, n), Arrays.copyOfRange(vin, i+1, n) ); } } return root; } }