请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
数据范围: 
要求: 空间复杂度
,时间复杂度 )
要求: 空间复杂度
如输入[1,2,4,5,3],[4,2,5,1,3]时,通过前序遍历的结果[1,2,4,5,3]和中序遍历的结果[4,2,5,1,3]可重建出以下二叉树:
所以对应的输出为[1,3,5]。
[1,2,4,5,3],[4,2,5,1,3]
[1,3,5]
二叉树每个节点的值在区间[1,10000]内,且保证每个节点的值互不相同。
import java.util.*; /** * NC136 输出二叉树的右视图 * @author d3y1 */ public class Solution { private ArrayList<Integer> list = new ArrayList<>(); /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * * 相似 -> NC12 重建二叉树 [nowcoder] * 相似 -> NC223 从中序与后序遍历序列构造二叉树 [nowcoder] * * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve (int[] preOrder, int[] inOrder) { return solution1(preOrder, inOrder); // return solution2(preOrder, inOrder); } // val -> idx private HashMap<Integer,Integer> inMap = new HashMap<>(); private int preRootIdx = 0; /** * 前序遍历 + 层序遍历 * @param preOrder * @param inOrder * @return */ private int[] solution1(int[] preOrder, int[] inOrder){ int n = inOrder.length; if(n == 0){ return new int[]{}; } for(int i=0; i<n; i++){ inMap.put(inOrder[i], i); } // 构建树 TreeNode root = build(preOrder, 0, n-1); // 右视图 levelOrder(root); int[] result = new int[list.size()]; for(int i=0; i<list.size(); i++){ result[i] = list.get(i); } return result; } /** * 递归遍历(前序) * * 二叉树前序遍历: 根 -> 左 -> 右 * 可利用该性质直接找到前序遍历根节点, 子树遍历先左后右: (根) -> 左 -> 右 * * @param preOrder * @param inLeft * @param inRight * @return */ private TreeNode build(int[] preOrder, int inLeft, int inRight){ if(inLeft > inRight){ return null; } // 根 int preRootVal = preOrder[preRootIdx++]; TreeNode root = new TreeNode(preRootVal); if(inLeft == inRight){ return root; } // 中序遍历根结点索引 int inRootIdx = inMap.get(preRootVal); // 左 root.left = build(preOrder, inLeft, inRootIdx-1); // 右 root.right = build(preOrder, inRootIdx+1, inRight); return root; } /** * 前序遍历 + 层序遍历 * @param preOrder * @param inOrder * @return */ private int[] solution2(int[] preOrder, int[] inOrder){ int n = inOrder.length; if(n == 0){ return new int[]{}; } // 构建树 TreeNode root = construct(preOrder, inOrder); // 右视图 levelOrder(root); int[] result = new int[list.size()]; for(int i=0; i<list.size(); i++){ result[i] = list.get(i); } return result; } /** * 递归(前序) * @param preOrder * @param inOrder * @return */ public TreeNode construct(int[] preOrder, int[] inOrder){ int n = preOrder.length; if(n == 0){ return null; } // 当前根结点 int rootVal = preOrder[0]; TreeNode root = new TreeNode(rootVal); // 当前根结点 左子树节点个数 int left = 0; while(inOrder[left] != rootVal){ left++; } if(left > 0){ root.left = construct(Arrays.copyOfRange(preOrder, 1, left+1), Arrays.copyOfRange(inOrder, 0, left)); } // 当前根结点 右子树节点个数 int right = n-(left+1); if(right > 0){ root.right = construct(Arrays.copyOfRange(preOrder, left+1, n), Arrays.copyOfRange(inOrder, left+1, n)); } return root; } /** * 层序遍历 * @param root */ private void levelOrder(TreeNode root){ // 双端队列 Deque<TreeNode> deque = new ArrayDeque<>(); deque.offerLast(root); int size; TreeNode tNode; while(!deque.isEmpty()){ size = deque.size(); list.add(deque.peekLast().val); while(size-- > 0){ tNode = deque.pollFirst(); if(tNode.left != null){ deque.offerLast(tNode.left); } if(tNode.right != null){ deque.offerLast(tNode.right); } } } } private class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val){ this.val = val; } } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve(int[] preOrder, int[] inOrder) { // write code here int n = preOrder.length; if (n < 1) { return new int[0]; } dfs(preOrder, inOrder, 0, 0, n - 1, 0); return res.stream().mapToInt(Integer::intValue).toArray(); } private List<Integer> res = new ArrayList<>(); private void dfs(int[] preorder, int[] inorder, int root, int start, int end, int depth) { if (start > end) { return; } int rootVal = preorder[root]; int i = start; while (i < end && preorder[root] != inorder[i]) { ++i; } if (res.size() <= depth) { res.add(rootVal); } else { res.set(depth, rootVal); } dfs(preorder, inorder, root + 1, start, i - 1, depth + 1); dfs(preorder, inorder, root + 1 + i - start, i + 1, end, depth + 1); } }
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve (int[] preOrder, int[] inOrder) { // write code here List<Integer> rightViewList = new LinkedList<>(); TreeNode root = reConstructBinaryTree(preOrder, inOrder); rightViewList = findRightReview(root); int[] res = new int[rightViewList.size()]; for (int i = 0; i < rightViewList.size(); i++) { res[i] = rightViewList.get(i); } return res; } // 重建二叉树 递归 public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) { // write code here if (preOrder.length == 0 || vinOrder.length == 0) return null; TreeNode root = new TreeNode(preOrder[0]); for (int i = 0; i < vinOrder.length; i++) { if (root.val == vinOrder[i]) { root.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder, 1, i + 1), Arrays.copyOfRange(vinOrder, 0, i)); root.right = reConstructBinaryTree(Arrays.copyOfRange(preOrder, i + 1, preOrder.length), Arrays.copyOfRange(vinOrder, i + 1, vinOrder.length)); break; } } return root; } // 找出二叉树右视图 层次遍历法 public List<Integer> findRightReview(TreeNode root) { List<Integer> res = new LinkedList<>(); Queue<TreeNode> q = new LinkedList<>(); q.add(root); while (!q.isEmpty()) { int qLength = q.size(); for (int i = 0; i < qLength; i++) { TreeNode temp = q.poll(); if (temp.left != null) { q.add(temp.left); } if (temp.right != null) { q.add(temp.right); } if (i == qLength - 1) { res.add(temp.val); } } } return res; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve (int[] preOrder, int[] inOrder) { // write code here List<Integer> result = new ArrayList<>(); if (preOrder.length < 1 || preOrder.length != inOrder.length) { return null; } // 根据前序遍历和中序遍历构造二叉树 TreeNode root = buildTree(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1); if (root == null) { return null; } // 使用迭代法寻找二叉树的最右侧节点 Deque<TreeNode> queue = new LinkedList<>(); queue.addLast(root); while (!queue.isEmpty()) { // 求出每层节点的数量 int size = queue.size(); for (int i = 0; i < size; i++) { TreeNode node = queue.removeFirst(); // size - 1即为最右侧节点,加入到result结果列表中 if (i == size - 1) { result.add(node.val); } if (node.left != null) { queue.addLast(node.left); } if (node.right != null) { queue.addLast(node.right); } } } return result.stream().mapToInt(x -> x).toArray(); } // 根据前序遍历和中序遍历构造二叉树 public TreeNode buildTree(int[] preOrder, int preStart, int preEnd, int[] inOrder, int inStart, int inEnd) { if (preStart > preEnd || inStart > inEnd) { return null; } int root_val = preOrder[preStart]; TreeNode root = new TreeNode(root_val); int index = 0; for (index = 0; index < inOrder.length; index++) { if (inOrder[index] == root_val) { break; } } int left_length = index - inStart; root.left = buildTree(preOrder, preStart + 1, preStart + left_length, inOrder, inStart, index - 1); root.right = buildTree(preOrder, preStart + left_length + 1, preEnd, inOrder, index + 1, inEnd); return root; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ int index=0; ArrayList<Integer> result=new ArrayList<>(); public int[] solve (int[] preOrder, int[] inOrder) { // write code here int deep=0; ArrayList<Integer>list=new ArrayList<>(); for(int i=0;i<inOrder.length;i++){ list.add(inOrder[i]); } a(list,preOrder,0,result); int[] r=new int[result.size()]; for(int i=0;i<r.length;i++){ r[i]=result.get(i); } return r; } public void a( ArrayList<Integer>list,int[] preOrder,int deep,ArrayList<Integer>result){ if(list.size()<=0||index==preOrder.length)return; if(deep>=result.size()) result.add(preOrder[index]); else result.set(deep,preOrder[index]); int flag=0; ArrayList<Integer>left=new ArrayList<>(); ArrayList<Integer>right=new ArrayList<>(); for(int b:list){ if(b==preOrder[index]){ flag=1; continue; } if(flag==0) left.add(b); else right.add(b); } index++; a(left,preOrder,deep+1,result); a(right,preOrder,deep+1,result); } }
//前需中序重建二叉树, 层次遍历从左到右,记录最后一位的数值,输出右视图结果
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 求二叉树的右视图
* @param preOrder int整型一维数组 先序遍历
* @param inOrder int整型一维数组 中序遍历
* @return int整型一维数组
*/
public int[] solve (int[] preOrder, int[] inOrder) {
// write code here
ArrayList<Integer> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
TreeNode root = reConstructBinaryTree(preOrder, inOrder);
queue.add(root);
if(preOrder.length==0||inOrder.length==0) return new int[0];
while (!queue.isEmpty()) {
int n = queue.size();
while(n-->0){
TreeNode temp = queue.poll();
//最右元素
if(n == 0)
res.add(temp.val);
if(temp.left != null)
queue.offer(temp.left);
if(temp.right != null)
queue.offer(temp.right);
}
}
int n = res.size();
int[] array = new int[n];
for(int i =0;i<n;++i){
array[i] =res.get(i);
}
return array;
}
public TreeNode reConstructBinaryTree (int[] preOrder, int[] inOrder) {
// write code here
int n = preOrder.length;
int m = inOrder.length;
if (n == 0 || m == 0) return null;
TreeNode root = new TreeNode(preOrder[0]);
for (int i = 0; i < inOrder.length; i++) {
if (preOrder[0] == inOrder[i]) {
root.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder, 1, i + 1),
Arrays.copyOfRange( inOrder, 0, i));
root.right = reConstructBinaryTree(Arrays.copyOfRange(preOrder, i + 1, preOrder.length),
Arrays.copyOfRange( inOrder, i + 1, inOrder.length));
break;
}
}
return root;
}
}
import java.util.*; public class Solution { // 将哈希表创建在成员变量的位置,这样就不用在参数中传递了 private HashMap<Integer,Integer> map = new HashMap<>(); // 根据前序遍历和中序遍历构建二叉树 private TreeNode buildTree(int[] preOrder, int[] inOrder) { // 1. 将中序遍历的结果放到哈希表中 for(int i = 0;i < inOrder.length;i++) { map.put(inOrder[i],i); } // 2. 调用具体的构造二叉树的方法 return process(preOrder,0,preOrder.length - 1,inOrder,0,inOrder.length - 1); } // 构造二叉树 private TreeNode process(int[] preOrder,int l1,int r1,int[] inOrder,int l2,int r2) { // 1. 递归退出条件 if(l1 > r1) { return null; } // 2. 构造根节点 TreeNode root = new TreeNode(preOrder[l1]); // 3. 找出中序遍历根节点的位置 int find = map.get(preOrder[l1]); // 4. 左右递归连接根节点 root.left = process(preOrder,l1 + 1,l1 + find - l2,inOrder,l2,find - 1); root.right = process(preOrder,l1 + find - l2 + 1,r1,inOrder,find + 1,r2); // 5. 返回根节点 return root; } public int[] solve (int[] preOrder, int[] inOrder) { // 1. 参数校验 if(preOrder == null || inOrder == null || preOrder.length != inOrder.length) { return null; } // 2. 创建出二叉树 TreeNode root = buildTree(preOrder,inOrder); // 3. 创建辅助队列 Queue<TreeNode> queue = new LinkedList<>(); // 4. 创建答案数组 ArrayList<Integer> result = new ArrayList<>(); // 5. 将根节点加入到队列中 if(root != null) { queue.offer(root); } // 6. 队列不为空,弹出队列的元素,判断他有没有左右子树,有的话加入到队列中 while(!queue.isEmpty()) { // 7. 获取当前队列的元素个数(当层的元素个数) int size = queue.size(); // 8. 创建 ret 表示该层最后一个元素 int ret = 0; // 9. 遍历 size 个节点 while(size-- != 0) { // 10. 弹出队首元素 TreeNode cur = queue.poll(); // 11. 更新 ret ret = cur.val; // 12. 判断是否有左右子树 if(cur.left != null) { queue.offer(cur.left); } if(cur.right != null) { queue.offer(cur.right); } } // 13. ret 保存了该层最后一个节点的值 result.add(ret); } // 14. 将顺序表转化层数组返回 int[] ans = new int[result.size()]; for(int i = 0;i < result.size();i++) { ans[i] = result.get(i); } return ans; } }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve (int[] pre, int[] in) { // write code here //拿到根节点,层序遍历,每次遍历到每层的最后一个结点加入到ArrayList中 TreeNode root = solveRoot(pre , in) , temp; ArrayList<Integer> arr = new ArrayList<>(); Queue<TreeNode> q = new ArrayDeque<>(); q.add(root); while(!q.isEmpty()){ int k = q.size(); for (int i = 0; i < k; i++) { temp = q.poll(); if(i == k - 1){ arr.add(temp.val); } if(temp.left != null) q.add(temp.left); if(temp.right != null) q.add(temp.right); } } int[] res = new int[arr.size()]; for (int i = 0; i < arr.size(); i++) { res[i] = arr.get(i); } return res; } //复原树返回根节点 public TreeNode solveRoot(int[] pre , int[] in){ int n = pre.length; int m = in.length; if(n == 0 || m == 0){ return null; } TreeNode node = new TreeNode(pre[0]); for (int i = 0; i < m; i++) { if(pre[0] == in[i]){ node.left = solveRoot(Arrays.copyOfRange(pre , 1 , i + 1) , Arrays.copyOfRange(in , 0 , i)); node.right = solveRoot(Arrays.copyOfRange(pre , i + 1 , n) , Arrays.copyOfRange(in , i + 1 , m)); break; } } return node; } }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param inOrder int整型一维数组 中序遍历 * @return int整型一维数组 */ Map<Integer,Integer> map=new HashMap<>(); public int[] solve (int[] preOrder, int[] inOrder) { for(int i=0;i<inOrder.length;i++){ map.put(inOrder[i],i); } TreeNode root=build(preOrder,0,preOrder.length,inOrder,0,inOrder.length); //层序遍历 List<Integer> list=new ArrayList<>(); Deque<TreeNode> qu=new LinkedList<>(); qu.offer(root); while(!qu.isEmpty()){ int level=qu.size(); ArrayList<Integer> levelList=new ArrayList<>(); for(int i=0;i<level;i++){ TreeNode peek=qu.peekFirst(); levelList.add(qu.pollFirst().val); if(peek.left!=null) qu.offerLast(peek.left); if(peek.right!=null) qu.offerLast(peek.right); if(i==level-1){//当遍历到了最后一层,才加入ans list.add(peek.val); } } } int[] ans=new int[list.size()]; for(int i=0;i<list.size();i++){ ans[i]=list.get(i); } return ans; } public TreeNode build(int[] preOrder,int preBegin,int preEnd,int[] inOrder,int inBegin,int inEnd){ if(preBegin>=preEnd||inBegin>=inEnd){ return null; } int rootIndex=map.get(preOrder[preBegin]); TreeNode root=new TreeNode(preOrder[preBegin]); int leftValue=rootIndex-inBegin; root.left=build(preOrder,preBegin+1,preBegin+1+leftValue,inOrder,inBegin,rootIndex); root.right=build(preOrder,preBegin+1+leftValue,preEnd,inOrder,rootIndex+1,inEnd); return root; }
import java.util.*; public class Solution { public int[] solve (int[] xianxu, int[] zhongxu) { // write code here //先序 List<Integer> preList=new ArrayList<>(); //中序 List<Integer> midList=new ArrayList<>(); for(int i=0;i<xianxu.length;i++){ preList.add(xianxu[i]); midList.add(zhongxu[i]); } //构建树 TreeNode root=getTree(preList,midList); Queue<TreeNode> queue=new LinkedList<>(); queue.add(root); ArrayList<Integer> getResult=new ArrayList<>(); //层序遍历获取最右边的值 while(!queue.isEmpty()){ int size=queue.size(); for(int i=0;i<size;i++){ TreeNode node=queue.poll(); if(i==size-1){ getResult.add(node.val); } if(node.left!=null){ queue.add(node.left); } if(node.right!=null){ queue.add(node.right); } } } //将结果输出到数组 int arr[]=new int[getResult.size()]; for(int i=0;i<getResult.size();i++){ arr[i]=getResult.get(i); } return arr; } //构造树 public TreeNode getTree(List<Integer> preList,List<Integer> midList){ if(midList.isEmpty()){ return null; } int rootVal=preList.remove(0); TreeNode root=new TreeNode(rootVal); int mid=midList.indexOf(rootVal); root.left=getTree(preList,midList.subList(0,mid)); root.right=getTree(preList,midList.subList(mid+1,midList.size())); return root; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型一维数组 先序遍历 * @param zhongxu int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve (int[] xianxu, int[] zhongxu) { TreeNode root = dfs(0, 0, zhongxu.length - 1, xianxu,zhongxu); return TreerightView(root); } private int[] TreerightView(TreeNode root){ if(root==null){ return new int[0]; } Queue<TreeNode> qu = new LinkedList<>(); ArrayList<Integer> arr = new ArrayList<>(); qu.add(root); while(!qu.isEmpty()){ int size = qu.size(); for(int i=0;i<size;i++){ TreeNode cur = qu.poll(); if(i==size-1) arr.add(cur.val); if(cur.left!=null) qu.add(cur.left); if(cur.right!=null) qu.add(cur.right); } } // //将ArrayList转为int[] // int arrsize = arr.size(); // int[] arrint = new int[arrsize]; // for(int i=0;i<arrsize;i++){ // arrint[i]=arr.get(i).intValue(); // } // return arrint; return arr.stream().mapToInt(Integer::intValue).toArray(); } private TreeNode dfs(int preStart, int vinStart, int vinEnd, int[] preOrder,int[] vinOrder) { //元素为空//位置不对 if (preStart > preOrder.length - 1 || vinStart > vinEnd) { return null; } //从先序遍历首元素构建结点 TreeNode root = new TreeNode(preOrder[preStart]); int index = 0; //查找中序遍历结果位置 for (int i = vinStart; i <= vinEnd; i++ ) { if (vinOrder[i] == root.val) { index = i; break; } } //左结点为先序下一个结点,且该节点位于index左侧 root.left = dfs(preStart + 1, vinStart, index - 1, preOrder, vinOrder); //右结点先序位置为当前结点先序位置+(当前结点左子树数量(当前中序位置-中序开始位置)+当前结点) root.right = dfs(preStart + index - vinStart + 1, index + 1, vinEnd, preOrder,vinOrder); return root; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型一维数组 先序遍历 * @param zhongxu int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve (int[] xianxu, int[] zhongxu) { // write code here TreeNode root = build(xianxu, 0, xianxu.length - 1, zhongxu, 0, zhongxu.length - 1); //找到右视图 LinkedList<TreeNode> qu = new LinkedList<TreeNode>(); qu.add(root); List<Integer> list = new ArrayList<Integer>(); while (!qu.isEmpty()) { int size = qu.size(); list.add(qu.get(size-1).val); while (size > 0) { size--; TreeNode temp = qu.remove(); if (temp.left != null) { qu.add(temp.left); } if (temp.right != null) { qu.add(temp.right); } } } //转换list为数组arr int[] arr = new int[list.size()]; int index = 0; for (Integer item : list) { arr[index++] = item; } //返回结果 return arr; } TreeNode build(int[] preOrder, int preStart, int preEnd, int[] inOrder, int inStart, int inEnd) { if (preStart > preEnd) { return null; } int rootVal = preOrder[preStart]; //找到中序中rootVal的位置index int index = inStart; while (index < inEnd) { if (inOrder[index] == rootVal) { break; } index++; } //确定中序左子树的长度leftsize int leftsize = index - inStart; TreeNode root = new TreeNode(rootVal); root.left = build(preOrder, preStart + 1, preStart + leftsize, inOrder, inStart, index - 1); root.right = build(preOrder, preStart + leftsize + 1, preEnd, inOrder, index + 1, inEnd); return root; } }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型一维数组 先序遍历 * @param zhongxu int整型一维数组 中序遍历 * @return int整型一维数组 */ List<Integer> arrayList = new ArrayList(); public int getRootIndexInOrder(int[] xianxu, int[] zhongxu) { for (int i = 0; i < zhongxu.length; i++) { if (xianxu[0] == zhongxu[i]) return i; } return -1; } public TreeNode getRightTree(int[] xianxu, int[] zhongxu) { // write code here if (xianxu == null || xianxu.length == 0) return null; int preLength = xianxu.length; int inOrderLength = zhongxu.length; // 创建树根 TreeNode root = new TreeNode(xianxu[0]); int index = getRootIndexInOrder(xianxu, zhongxu); // 先序:[1,2,4,5,3] // 中序:[4,2,5,1,3] root.left = getRightTree( Arrays.copyOfRange(xianxu, 1, index + 1), Arrays.copyOfRange(zhongxu, 0, index) ); root.right = getRightTree( Arrays.copyOfRange(xianxu, index + 1, preLength), Arrays.copyOfRange(zhongxu, index + 1, inOrderLength) ); return root; } public void getRightViewList(TreeNode root) { if (root == null) return; Queue<TreeNode> queue = new LinkedList(); queue.add(root); while (!queue.isEmpty()) { int size = queue.size(); while (size-- != 0) { TreeNode poll = queue.poll(); if (poll.left != null) { queue.add(poll.left); } if (poll.right != null) { queue.add(poll.right); } if (size == 0) arrayList.add(poll.val); } } } public int[] solve (int[] xianxu, int[] zhongxu) { TreeNode root = getRightTree(xianxu, zhongxu); getRightViewList(root); return arrayList.stream().mapToInt(Integer::intValue).toArray(); } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型一维数组 先序遍历 * @param zhongxu int整型一维数组 中序遍历 * @return int整型一维数组 */ public int[] solve (int[] xianxu, int[] zhongxu) { // write code here //1、重建树 TreeNode root = rebuildTree(xianxu, zhongxu); //2、右视图 List<Integer> list = new ArrayList<>(); rightview(root, 0, list); //3、将list变为int[] int[] ans = new int[list.size()]; for (int i = 0; i < list.size(); i++) { ans[i] = list.get(i); } return ans; } private TreeNode rebuildTree(int[] xianxu, int[] zhongxu) { int pl = xianxu.length; int ml = zhongxu.length; //分治算法 if (pl == 0 || ml == 0) return null; TreeNode node = new TreeNode(xianxu[0]);//根 //找到中序根中对应的第一个序号 for (int i = 0; i < ml ; i++) { if (xianxu[0] == zhongxu[i]) { node.left = rebuildTree(Arrays.copyOfRange(xianxu, 1, i + 1), Arrays.copyOfRange(zhongxu, 0, i)); node.right = rebuildTree(Arrays.copyOfRange(xianxu, i + 1, pl), Arrays.copyOfRange(zhongxu, i + 1, ml)); break; } } return node; } private void rightview(TreeNode root, int height, List<Integer> list) { if (root == null) return ; if (height == list.size()) list.add(0); //每层初始化为0 list.set(height++, root.val); //按照从左到右的顺序,某个高度的最后一个值必为右 rightview(root.left, height, list); rightview(root.right, height, list); } }
import java.util.*; public class Solution { public int[] solve (int[] pre, int[] in) { if (pre == null || pre.length == 0) return new int[0]; ArrayList<Integer> res = new ArrayList<>(); TreeNode root = buildTree(pre, in); Deque<TreeNode> queue = new ArrayDeque<>(pre.length / 2); queue.offer(root); while (! queue.isEmpty()) { res.add(queue.getLast().val); for (int i = 0, size = queue.size(); i < size; i++) { root = queue.poll(); if (root.left != null) queue.offer(root.left); if (root.right != null) queue.offer(root.right); } } return res.stream().mapToInt(Integer::intValue).toArray(); } public TreeNode buildTree(int [] pre,int [] in) { if (pre == null || pre.length == 0) return null; HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < in.length; i++) { map.put(in[i], i); } TreeNode root = new TreeNode(-1); Stack<TreeNode> stack = new Stack<>(); stack.push(root); Stack<Integer> idxs = new Stack<>(); idxs.push(in.length - 1); idxs.push(0); idxs.push(pre.length - 1); idxs.push(0); while (! stack.isEmpty()) { TreeNode node = stack.pop(); int preLeft = idxs.pop(); int preRight = idxs.pop(); int inLeft = idxs.pop(); int inRight = idxs.pop(); node.val = pre[preLeft]; int inIndex = map.get(pre[preLeft]); int leftCount = inIndex - inLeft; if (inLeft < inIndex ) { node.left = new TreeNode(-1); stack.push(node.left); idxs.push(inIndex - 1); idxs.push(inLeft); idxs.push(preLeft + leftCount); idxs.push(preLeft + 1); } if (inIndex < inRight) { node.right = new TreeNode(-1); stack.push(node.right); idxs.push(inRight); idxs.push(inIndex + 1); idxs.push(preRight); idxs.push(preLeft + leftCount + 1); } } return root; } }