请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
数据范围: 
要求: 空间复杂度
,时间复杂度 )
要求: 空间复杂度
如输入[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]内,且保证每个节点的值互不相同。
/**1先构造二叉树
2程序遍历
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
public List<Integer>list=new ArrayList<Integer>();
public int[] solve (int[] xianxu, int[] zhongxu) {
// write code here
TreeNode head =dfs(xianxu,zhongxu);
getRightList(head);
int[]a=new int[list.size()];
for(int i=0;i<list.size();i++){
a[i]=list.get(i);
}
return a;
}
public TreeNode dfs(int[]xianxu,int[] zhongxu ){
if(xianxu.length==0||zhongxu.length==0){
return null;
}
TreeNode head= new TreeNode(xianxu[0]);
if(xianxu.length==1||zhongxu.length==1){
return head;
}
for(int i=0;i<zhongxu.length;i++){
if(zhongxu[i]==xianxu[0]){
head.left=dfs(Arrays.copyOfRange(xianxu,1,i+1),Arrays.copyOfRange(zhongxu,0,i));
head.right=dfs(Arrays.copyOfRange(xianxu,i+1,xianxu.length),Arrays.copyOfRange(zhongxu,i+1,zhongxu.length));
}
}
return head;
}
public void getRightList(TreeNode root){
Queue<TreeNode> q=new LinkedList<TreeNode>();
q.offer(root);
while(!q.isEmpty()){
int mount=q.size();
for(int i=0;i<mount;i++){
if(q.peek().left!=null)
q.offer(q.peek().left);
if(q.peek().right!=null)
q.offer(q.peek().right);
if(i==mount-1){
list.add(q.poll().val);
} else{
q.poll();
}
}
}
}
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
// 1、创建节点类型
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
// 2、创建二叉树
function buildTree(xianxu, zhongxu) {
if(xianxu.length === 0 || zhongxu.length === 0) {
return null;
}
let root = new TreeNode(xianxu[0]);
let index = zhongxu.indexOf(root.val);
let leftPre = xianxu.slice(1, index + 1);
let leftVin = zhongxu.slice(0, index);
root.left = buildTree(leftPre, leftVin);
let rightPre = xianxu.slice(index + 1);
let rightVin = zhongxu.slice(index + 1);
root.right = buildTree(rightPre, rightVin);
return root;
}
// 3、输出二叉树的右视图
function printRight(root) {
if(!root) {
return [];
}
let res = [];
let queue = [root];
let index = 0;
while(queue.length) {
let len = queue.length;
for(let i=0; i<len; i++) {
let node = queue.shift();
if(i === (len - 1)) {
res[index] = node.val;
index++;
}
if(node.left) {
queue.push(node.left);
}
if(node.right) {
queue.push(node.right);
}
}
}
return res;
}
function solve( xianxu , zhongxu ) {
let root = buildTree(xianxu, zhongxu);
let rightView = printRight(root);
return rightView;
}
module.exports = {
solve : solve
}; 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 = reCons(xianxu, zhongxu);
return bfs(root);
}
public TreeNode reCons (int[] xianxu, int[] zhongxu) {
if(xianxu == null || xianxu.length == 0) return null;
int val = xianxu[0], position = 0, len = xianxu.length;
TreeNode root = new TreeNode(val);
for(position = 0; position < len; position++) {
if(zhongxu[position] == val) break;
}
root.left = reCons(Arrays.copyOfRange(xianxu, 1, position + 1), Arrays.copyOfRange(zhongxu, 0 , position));
root.right = reCons(Arrays.copyOfRange(xianxu, position + 1, len), Arrays.copyOfRange(zhongxu,position + 1, len));
return root;
}
public int[] bfs (TreeNode root) {
if(root == null) return null;
List<Integer> ls = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
int temp = 0;
while(!q.isEmpty()) {
int size = q.size();
while(size > 0) {
TreeNode t = q.poll();
if(t.left != null) q.add(t.left);
if(t.right != null) q.add(t.right);
size--;
temp = t.val;
}
ls.add(temp);
}
int[] res = new int[ls.size()];
for(int i = 0; i < res.length; i++) {
res[i] = ls.get(i);
}
return res;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
public int[] solve (int[] xianxu, int[] zhongxu) {
if (xianxu.length == 0 || zhongxu.length == 0){
return null;
}
List<TreeNode> list = new ArrayList<>();
TreeNode root = build(xianxu, zhongxu);
//队列交换
//指针cur永远指向不为空的队列
Queue<TreeNode> cur = new LinkedList<>();
//指针temp永远指向空的队列
Queue<TreeNode> temp = new LinkedList<>();
cur.offer(root);
//cur指向的队列进行出队操作,temp指向的队列进行入队操作
while (!cur.isEmpty()){
TreeNode poll = cur.poll();
if (cur.size() == 0){
list.add(poll);
}
if (poll.left != null){
temp.offer(poll.left);
}
if (poll.right != null){
temp.offer(poll.right);
}
if (cur.isEmpty()){
Queue<TreeNode> t = cur;
cur = temp;
temp = t;
}
}
int[] result = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i).val;
}
return result;
}
private TreeNode build(int[] pre, int[] in){
if (pre.length == 0 || in.length == 0){
return null;
}
TreeNode root = new TreeNode(pre[0]);
if (pre.length == 1 || in.length == 1){
return root;
}
int rootIndex = 0;
for (int i = 0; i < in.length; i++) {
if (in[i] == root.val){
rootIndex = i;
break;
}
}
root.left =
build(Arrays.copyOfRange(pre, 1, rootIndex+1), Arrays.copyOfRange(in, 0, rootIndex));
root.right =
build(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(in,rootIndex+1,in.length));
return root;
}
} function solve( xianxu , zhongxu ) {
const root = buildTree(xianxu, zhongxu);
const rightView = getRightView(root);
return rightView;
}
function buildTree(xianxu, zhongxu) {
if (xianxu.length === 0) return null;
const root = new TreeNode(xianxu[0]);
const index = zhongxu.indexOf(root.val);
const lefts = zhongxu.slice(0, index);
const rights = zhongxu.slice(index + 1);
root.left = buildTree(xianxu.slice(1, lefts.length + 1), lefts);
root.right = buildTree(xianxu.slice(lefts.length + 1), rights);
return root;
}
function getRightView(root) {
const res = [];
let stack = [root];
while (stack.length) {
const rowLen = stack.length;
const newStack = [];
for (let i = 0; i < rowLen; i++) {
const node = stack[i];
if (i === stack.length - 1) res.push(node.val);
if (node.left) newStack.push(node.left);
if (node.right) newStack.push(node.right);
}
stack = newStack;
}
return res;
} class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def solve(self , preorder , inorder ):
# 递归函数,用于返回当前根结点并求其左右孩子
def myBuildTree(preorder_left: int, preorder_right: int, inorder_left: int, inorder_right: int):
if preorder_left > preorder_right:
return None
# 前序遍历中的第一个节点就是根节点
preorder_root = preorder_left
# 在中序遍历中定位根节点
inorder_root = index[preorder[preorder_root]]
# 先把根节点建立出来
root = TreeNode(preorder[preorder_root])
# 得到左子树中的节点数目
size_left_subtree = inorder_root - inorder_left
# 递归地构造左子树,并连接到根节点
# 先序遍历中从 左边界+1 开始的 size_left_subtree 个元素就对应了中序遍历中从 左边界 开始到 根节点定位-1 的元素
root.left = myBuildTree(preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1)
# 递归地构造右子树,并连接到根节点
# 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素
root.right = myBuildTree(preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right)
return root
n = len(preorder)
# 构造哈希映射,帮助我们快速定位根节点
index = {element: i for i, element in enumerate(inorder)}
bitree = myBuildTree(0, n - 1, 0, n - 1)
# 开始求右视图,每层遍历到最后一个元素时,队尾入队一个-1,标记最后一个元素要输出
queue = [bitree, -1]
cur = -1
res = list()
while len(queue) > 1:
last = cur
cur = queue.pop(0)
if cur == -1:
if type(last) == TreeNode:
res.append(last.val)
queue.append(-1)
else:
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
res.append(cur.val) # 不知怎的,反正最终一个元素需要手动append
return res import java.util.*;
public class Solution {
private List<Integer> res;
private int[] myPre;
private int[] myIn;
private int len;
public int[] solve (int[] xianxu, int[] zhongxu) {
res = new ArrayList<>();
myPre = xianxu;
myIn = zhongxu;
len = xianxu.length;
dfs(0, len - 1, 0, len - 1, 0);
int[] ans = new int[res.size()]; // 转成数组返回
for (int i = 0; i < res.size(); i++) {
ans[i] = res.get(i);
}
return ans;
}
private void dfs(int start1, int end1, int start2, int end2, int level) {
if (start1 > end1) {
return;
}
int rootVal = myPre[start1]; // 当前根结点
if (res.size() <= level) { // 说明当前是最左节点,只能add,不能覆盖
res.add(rootVal);
}
else {
res.set(level, rootVal); // 覆盖同一level中之前记录过的节点,最终保留的就是每一level的最右节点
}
for (int i = 0; i < len; i++) {
if (myIn[i] == rootVal) { // 递归调用
dfs(start1 + 1, start1 + i - start2, start2, i - 1, level + 1);
dfs(start1 + i - start2 + 1, end1, i + 1, end2, level + 1);
break;
}
}
}
}
//先构建出二叉树,再打印出右视图
class Solution {
public:
vector<int> ans;
vector<int> solve(vector<int> &preorder, vector<int> &inorder) {
int presize = preorder.size();
int insize = inorder.size();
if (presize != insize || presize == 0 || insize == 0)
return ans;
auto head = ReconstructTree(preorder, inorder, 0, presize - 1, 0, insize - 1);
rightTree(head);
return ans;
}
void rightTree(TreeNode *head) {
queue<TreeNode *> q;
q.push(head);
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
auto tmp = q.front();
q.pop();
if (tmp->left) q.push(tmp->left);
if (tmp->right) q.push(tmp->right);
if (i == size - 1) ans.push_back(tmp->val);
}
}
}
TreeNode *ReconstructTree(vector<int> &preorder, vector<int> &inorder, int pl, int pr, int il, int ir) {
auto *root = new TreeNode(preorder[pl]);
if (pl == pr) return root;
int index = 0;
for (int i = il; i <= ir; i++) {
if (inorder[i] == preorder[pl]) {
index = i;
break;
}
}
int ltreelen = index - il;
int rtreelen = ir - index;
if (ltreelen > 0) root->left = ReconstructTree(preorder, inorder, pl + 1, pl + ltreelen, il, index - 1);
if (rtreelen > 0) root->right = ReconstructTree(preorder, inorder, pl + 1 + ltreelen, pr, index + 1, ir);
return root;
}
}; import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
*
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
public int[] solve(int[] xianxu, int[] zhongxu) {
// write code here
lists.add(new ArrayList<Integer>());
TreeNode root = Go(xianxu, zhongxu);
Go2(root, 0);
ArrayList<Integer> list = new ArrayList<>();
//将二叉树 层次便利的 每层的额最后一个 值存入新的 ArrayList 中 转化为 数组
for (int i = 0; i < lists.size(); i++) {
list.add(lists.get(i).get(lists.get(i).size() - 1));
}
int result[] = list.stream().mapToInt(Integer::valueOf).toArray();
return result;
}
//此方法用来重建二叉树
private TreeNode Go(int[] pre, int[] in) {
if (pre.length == 0 || in.length == 0) {
return null;
}
TreeNode node = new TreeNode(pre[0]);
for (int i = 0; i < in.length; i++) {
if (in[i] == pre[0]) {
node.left = Go(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(in, 0, i));
node.right = Go(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(in, i + 1, in.length));
break;
}
}
return node;
}
//此方法用来 二叉树的 层次遍历到 ArrayList<ArrayList<Integer>>中
private void Go2(TreeNode root, int flag) {
if (lists.size() < flag + 1) {
lists.add(new ArrayList<Integer>());
}
lists.get(flag).add(root.val);
if (root.left != null)
Go2(root.left, flag + 1);
if (root.right != null)
Go2(root.right, flag + 1);
}
} 先把树构建出来,在通过队列取出每层的最后一个节点的值
时间复杂度:O(n) 空间复杂度:O(n)
class Solution:
def tree(self, pre, vin):
if not pre:
return None
root = TreeNode(pre[0])
tem = vin.index(pre[0])
root.left = self.tree(pre[1:tem+1], vin[:tem])
root.right = self.tree(pre[tem+1:], vin[tem+1:])
return root
def solve(self , pre: List[int], vin: List[int]) -> List[int]:
res = []
root = self.tree(pre, vin)
q = [root]
while q:
n = len(q)
for i in range(n):
cur = q.pop(0)
if i == n-1:
res.append(cur.val)
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
return res
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
public int[] solve (int[] xianxu, int[] zhongxu) {
Map<Integer,Integer> map = new HashMap<>();
if (xianxu.length == 0 || xianxu.length != zhongxu.length) return new int[0];
findU(xianxu, zhongxu, 0, xianxu.length - 1, 0, zhongxu.length - 1, map, 0);
int[] res = new int[xianxu.length];
int len = 0;
Integer temp;
while ((temp = map.get(len)) != null) {
res[len++] = temp;
}
return Arrays.copyOf(res, len);
// write code here
}
private void findU(int[] xianxu, int[] zhongxu, int xleft, int xright,
int zleft, int zright, Map<Integer, Integer> map, int level) {
if (xleft > xright || zleft > zright) return;
int p = xianxu[xleft];
int i = zleft;
for (; i <= zright && zhongxu[i] != p; i++);
// 如果存在则说明构建右节点的时候已经放进去了
if (!map.containsKey(level))
map.put(level, p);
// 先构建右边的结点 i - zleft代表左节点有多少个
findU(xianxu, zhongxu, xleft + (i - zleft) + 1, xright, i + 1, zright, map, level + 1);
// 构建左结点
findU(xianxu, zhongxu, xleft + 1, xleft + (i - zleft), zleft, i - 1, map, level + 1);
}
} class Solution: def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]: if not preOrder: return [] res = [preOrder[0]] index = inOrder.index(preOrder[0]) # 左子树的右视图 left = self.solve(preOrder[1:index+1], inOrder[:index]) # 右子树的右视图 right = self.solve(preOrder[index+1:], inOrder[index+1:]) # 优先取右子树,剩余取左子树 return res + right + left[len(right):]
public int[] solve(int[] xianxu, int[] zhongxu) {
TreeNode node = initTreeNode(xianxu, zhongxu);
Map<Integer, Integer> deep = new HashMap<>();
resolve(node, 0, deep);
int[] res = new int[deep.size()];
for (int i = 0; i < deep.size(); i++) {
res[i] = deep.get(i);
}
return res;
}
private void resolve(TreeNode node, Integer deepth, Map<Integer, Integer> deep) {
if (node == null) {
return;
}
deep.put(deepth, node.val);
resolve(node.left, deepth + 1, deep);
resolve(node.right, deepth + 1, deep);
}
private TreeNode initTreeNode(int[] prev, int[] middle) {
//[1,2,4,5,3],[4,2,5,1,3]
if (prev.length == 0) {
return null;
}
int root = prev[0];
TreeNode node = new TreeNode(root);
int i = 0;
for (; i < middle.length; i++) {
if (middle[i] == root) {
break;
}
}
// 左子树 [1,i-1]
int[] leftMid = Arrays.copyOfRange(middle, 0, i);
int[] leftPre = Arrays.copyOfRange(prev, 1, i + 1);
node.left = initTreeNode(leftPre, leftMid);
// 右子树[i+1,middle.length]
int[] rightMid = Arrays.copyOfRange(middle, i + 1, prev.length);
int[] rightPrev = Arrays.copyOfRange(prev, i + 1, prev.length);
node.right = initTreeNode(rightPrev, rightMid);
return node;
} class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型vector 先序遍历
* @param zhongxu int整型vector 中序遍历
* @return int整型vector
*/
TreeNode* reBuild(vector<int>& pre, vector<int>& in)
{
int len = pre.size();
if(!len)
{
return NULL;
}
int root_val = pre[0];
TreeNode* root = new TreeNode(root_val);
int left_len = -1;
for(int i = 0; i < len; i++)
{
if(in[i] == root_val)
{
left_len = i;
break;
}
}
vector<int> pre_left(pre.begin() + 1, pre.begin() + 1 + left_len);
vector<int> pre_right(pre.begin() + 1 + left_len, pre.end());
vector<int> in_left(in.begin(), in.begin() + left_len);
vector<int> in_right(in.begin() + left_len + 1, in.end());
root->left = reBuild(pre_left, in_left);
root->right = reBuild(pre_right, in_right);
return root;
}
vector<int> solve(vector<int>& pre, vector<int>& in) {
// write code here
TreeNode* root = reBuild(pre, in);
vector<int> res;
if(!root)
{
return res;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
int len = q.size();
TreeNode* node;
for(int i = 0; i < len; i++)
{
node = q.front();
q.pop();
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
}
res.push_back(node->val);
}
return res;
}
}; class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型vector 先序遍历
* @param zhongxu int整型vector 中序遍历
* @return int整型vector
*/
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
vector<int> rightView;
int len=xianxu.size();
if(len==0 || len!=zhongxu.size()) {
return rightView;
}
int rootVal=xianxu[0];
rightView.push_back(rootVal);
int i;
for(i=0;i<zhongxu.size();i++) {
if(zhongxu[i]==rootVal) {
break;
}
}
int index=1;
dfs(xianxu,index,zhongxu,0,i-1,rightView,1);
dfs(xianxu,index,zhongxu,i+1,len-1,rightView,1);
return rightView;
}
void dfs(vector<int>& xianxu, int& index, vector<int>& zhongxu,int left,int right,vector<int>& rightView,int num) {
if(index==xianxu.size() || left>right) {
return ;
}
if(rightView.size()<=num) {
rightView.push_back(xianxu[index]); //子树根节点
} else{
rightView[num]=xianxu[index];//右边的点覆盖右视图
}
int i=0;
for(i=left;i<=right;i++) {
if(zhongxu[i]==xianxu[index]) {
index++;
dfs(xianxu,index,zhongxu,left,i-1,rightView,num+1);
dfs(xianxu,index,zhongxu,i+1,right,rightView,num+1);
}
}
}
}; class Solution {
private:
unordered_map<int, int> mp;
public:
vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
// write code here
for(int i=0; i<zhongxu.size(); ++i) {
mp[zhongxu[i]] = i;
}
TreeNode* root = rebuild(xianxu, zhongxu, 0, xianxu.size()-1, 0, zhongxu.size()-1);
vector<int> res = levelOrder(root);
return res;
}
TreeNode* rebuild(vector<int>& preOrder, vector<int>& inOrder, int p1, int p2, int i1, int i2) {
if(p1>p2) return nullptr;
TreeNode* node = new TreeNode(preOrder[p1]);
int r = mp[node->val];
node->left = rebuild(preOrder, inOrder, p1+1, p1+r-i1, i1, r-1);
node->right = rebuild(preOrder, inOrder, p1+r-i1+1, p2, r+1, i2);
return node;
}
vector<int> levelOrder(TreeNode* root) {
vector<int> res;
if(!root) return res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()) {
int size = q.size();
for(int i=0; i<size; ++i) {
TreeNode* node = q.front();
q.pop();
if(i==size-1) res.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return res;
}
};
二合一
#include <queue>
#include <sys/types.h>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 求二叉树的右视图
* @param preOrder int整型vector 先序遍历
* @param inOrder int整型vector 中序遍历
* @return int整型vector
*/
TreeNode* reconstTree(vector<int>& preOrder, vector<int>& inOrder) {
int m = preOrder.size();
int n = inOrder.size();
if (m == 0 || n == 0) {
return nullptr;
}
TreeNode* root = new TreeNode(preOrder[0]);
for (int i = 0; i < n; i++) {
if (preOrder[0] == inOrder[i]) {
vector<int> leftpre(preOrder.begin() + 1, preOrder.begin() + i + 1);
vector<int> leftin(inOrder.begin(), inOrder.begin() + i);
root->left = reconstTree(leftpre, leftin);
vector<int> rightpre(preOrder.begin() + i + 1, preOrder.end());
vector<int> rightin(inOrder.begin() + i+1, inOrder.end());
root->right = reconstTree(rightpre, rightin);
break;
}
}
return root;
}
vector<int> solve(vector<int>& preOrder, vector<int>& inOrder) {
// write code here
//首先重建二叉树
TreeNode* root = reconstTree(preOrder, inOrder);
queue<TreeNode*> q;
q.push(root);
vector<int> res;
while (!q.empty()) {
int sz = q.size();
for (int i = 0; i < sz; i++) {
TreeNode* node = q.front();
q.pop();
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
if (i == sz - 1) {
res.push_back(node->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
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 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;
}
}