/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求二叉树的右视图 * @param preOrder int整型一维数组 先序遍历 * @param preOrderLen int preOrder数组长度 * @param inOrder int整型一维数组 中序遍历 * @param inOrderLen int inOrder数组长度 * @return int整型一维数组 * @return int* returnSize 返回数组行数 */ int* solve(int* preOrder, int preOrderLen, int* inOrder, int inOrderLen, int* returnSize ) { // write code here if(!preOrder || !inOrder) {*returnSize = 0; return NULL;} struct TreeNode *pTN_stk[preOrderLen]; int idx = 0, i = 1, j = 0, top, cmp; struct TreeNode *Header = (struct TreeNode *)calloc(1, sizeof(struct TreeNode)); struct TreeNode *pHead = Header; pHead->val = top = preOrder[0]; cmp = inOrder[0]; pTN_stk[0] = pHead; while(i < preOrderLen) { if(top != cmp) { pHead->left = (struct TreeNode *)calloc(1, sizeof(struct TreeNode)); pHead = pHead->left; pHead->val = top = preOrder[i++]; pTN_stk[++idx] = pHead; continue; } j++; while(--idx != -1 && pTN_stk[idx]->val == inOrder[j]) { pHead = pTN_stk[idx]; j++; } pHead->right = (struct TreeNode *)calloc(1, sizeof(struct TreeNode)); pHead = pHead->right; pHead->val = top = preOrder[i++]; cmp = inOrder[j]; pTN_stk[++idx] = pHead; } int f_idx = 0, rear_idx = 0, record[preOrderLen], id = 0; pTN_stk[0] = Header; idx = 0; while(idx <= rear_idx) { while(idx < f_idx) { pHead = pTN_stk[idx++]; if(pHead->left) pTN_stk[++rear_idx] = pHead->left; if(pHead->right) pTN_stk[++rear_idx] = pHead->right; free(pHead); } pHead = pTN_stk[idx++]; if(pHead->left) pTN_stk[++rear_idx] = pHead->left; if(pHead->right) pTN_stk[++rear_idx] = pHead->right; record[id++] = pHead->val; free(pHead); f_idx = rear_idx; } int *res = (int*)malloc(id * sizeof(int)); memcpy(res, record, id*sizeof(int)); *returnSize = id; return res; }