输出二叉树的右视图
题目描述
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
public HashMap<Integer,Integer> z_Index = new HashMap();
public ArrayList<Integer> list = new ArrayList<Integer>();
public int[] solve (int[] xianxu, int[] zhongxu) {
// write code here
if(xianxu == null || zhongxu == null) return null;
//记录中序数值的位置索引
for(int i=0; i<zhongxu.length; i++){
z_Index.put(zhongxu[i], i);
}
//生成二叉树
TreeNode node = buildTree(xianxu, zhongxu, 0, 0, zhongxu.length-1);
//深度回溯
dfs(node, 0);
int[] res = new int[list.size()];
for(int i=0; i<list.size(); i++){
res[i] = list.get(i);
}
return res;
}
public void dfs(TreeNode tree, int hight){
if(tree == null) return;
//只有小于等于树的高度才加入
if(list.size() <= hight) list.add(tree.val);
//从右树开始
dfs(tree.right, hight+1);
dfs(tree.left, hight+1);
}
//len指当前中序的长度
public TreeNode buildTree(int[] xianxu, int[] zhongxu, int xIndex, int zIndex, int len){
if(zIndex > len) return null;
TreeNode node = new TreeNode(xianxu[xIndex]);
int mIndex = z_Index.get(xianxu[xIndex]);
node.left = buildTree(xianxu, zhongxu, xIndex+1, zIndex, mIndex-1);
node.right = buildTree(xianxu, zhongxu, xIndex+mIndex-zIndex+1, mIndex+1, len);
return node;
}
}