求后序遍历序列的第k个结点值_题库 | 华为研发工程师编程题型介绍及解析 第 10 期...

本文介绍了计算机视觉领域常见面试题型,包括二叉树后序遍历求解、逆序对计算、STL map映射问题等,并提供了详细的解题思路和示例。此外,还涵盖了数组相关问题和整数拆分问题,适合编程爱好者和求职者学习。
摘要由CSDN通过智能技术生成

题目1:给定一颗二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历。)

二叉树的前序、中序、后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。

输入示例:

两个字符串,其长度 n 均小于等于 26。

第一行为前序遍历,第二行为中序遍历。

二叉树中的结点名称以大写字母表示:A,B,C…. 最多 26 个结点。

输出示例:

输入样例可能有多组,对于每组测试样例,

输出一行,为后序遍历的字符串。

样例输入:

ABC

BAC

FDXEAG

XDEFAG

样例输出:

BCA

XEDGAF

#include #include #include #include using namespace std;struct TreeNode{
         char val;    TreeNode *left;    TreeNode *right;    TreeNode(char x):val(x),left(NULL),right(NULL){}};TreeNode* PreInBuildTree(string preorder,string inorder,int preIndex,int inIndex,int size){
         if(size <= 0){
             return NULL;    }//if    // 根节点    TreeNode* root = new TreeNode(preorder[preIndex]);    // 寻找根节点在中序遍历数组的下标    int index = 0;    for(int i = 0;i < size;++i){
             // 注意:inorder[inIndex+i]        if(preorder[preIndex] == inorder[inIndex+i]){
                 index = inIndex+i;            break;        }//if    }//for    // 左子树个数    int leftSize = index - inIndex;    // 右子树个数    int rightSize = size - leftSize - 1;    // 左子树    root->left = PreInBuildTree(preorder,inorder,preIndex+1,inIndex,leftSize);    // 右子树    root->right = PreInBuildTree(preorder,inorder,preIndex+1+leftSize,index+1,rightSize);    return root;}TreeNode *buildTree(string preorder,string inorder){
         int size = preorder.size();    if(size <= 0){
             return NULL;    }//if    return PreInBuildTree(preorder,inorder,0,0,size);}void PostOrder(TreeNode* root){
         if(root){
             PostOrder(root->left);        PostOrder(root->right);        cout<val;    }//if}int main(){
         string preStr,inStr;    //freopen("C:\\Users\\Administrator\\Desktop\\c++.txt","r",stdin);    while(cin>>preStr>>inStr){
             TreeNode* root = buildTree(preStr,inStr);        PostOrder(root);        cout<<endl;    }//while    return 0;}

题目2:有一组数,对于其中任意两个数组,若前面一个大于后面一个数字,则这两个数字组成一个逆序对。请设计一个高效的算法,计算给定数组中的逆序对个数。

给定一个int数组A和它的大小n,请返回A中的逆序对个数。保证n小于等于5000。

测试样例:

[1,2,3,4,5,6,7,0],8

返回:7

(一)、时间复杂度为 O (n^2)

(二)、时间复杂度为 O (nlogn)

1、归并排序的定义如下:

分而治之 (divide - conquer); 每个递归过程涉及三个步骤

第一,分解:把待排序的 n 个元素的序列分解成两个子序列,每个子序列包括 n/2 个元素.

第二,治理:对每个子序列分别调用归并排序 MergeSort, 进行递归操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值