/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param xianxuLen int xianxu数组长度
* @param zhongxu int整型一维数组 中序遍历
* @param zhongxuLen int zhongxu数组长度
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*
* C语言声明定义全局变量请加上static,防止重复定义
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
struct TreeNode* reConstructBinaryTree(int* pre, int preLen, int* vin, int vinLen ) {
// write code here
if(preLen==0 || vinLen==0){
return NULL;
}
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
int i = 0, j = 0;
while(pre[0] != vin[i]){
i++;
}
root->val = pre[0];
int newleftpre[i+1],newleftvin[i+1],newrightpre[preLen-i],newrightvin[preLen-i];
while(j < i){
newleftpre[j] = pre[j+1];
newleftvin[j] = vin[j];
j++;
}
j = 0;
while(i+j+1 < preLen){
newrightpre[j] = pre[i+j+1];
newrightvin[j] = vin[i+j+1];
j++;
}
root->left = reConstructBinaryTree(newleftpre,i,newleftvin,i);
root->right = reConstructBinaryTree(newrightpre,preLen-i-1,newrightvin,preLen-i-1);
return root;
}
int* solve(int* xianxu, int xianxuLen, int* zhongxu, int zhongxuLen, int* returnSize ) {
// write code here
struct TreeNode* root = reConstructBinaryTree(xianxu,xianxuLen,zhongxu,zhongxuLen);
if(root == NULL){
return NULL;
}
*returnSize = 0;
int* ret = (int*)malloc(sizeof(int)*10001);
struct TreeNode* queue[10001];
int head = 0, tail = 0;
queue[tail++] = root;
while(head != tail){
int curtail = tail;
struct TreeNode* p = queue[curtail-1];
ret[(*returnSize)++] = p->val;
while(head < curtail){
struct TreeNode* p = queue[head];
if(p->left){
queue[tail++] = p->left;
}
if(p->right){
queue[tail++] = p->right;
}
head++;
}
}
return ret;
}