輸出二叉樹的右檢視
阿新 • • 發佈:2021-01-04
技術標籤:Leetcode
輸出二叉樹的右檢視
題目描述
請根據二叉樹的前序遍歷,中序遍歷恢復二叉樹,並打印出二叉樹的右檢視
程式碼
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;
}
}