当前位置:   article > 正文

PTA 甲级真题 1151 LCA in a Binary Tree_pta甲级真题

pta甲级真题

题目链接

题目:求解最近公共祖先

思路:分别从两个结点向上遍历,最先遍历两次的就是LCA

涉及:根据中序和先序序列确定二叉树,我使用了map来映射结点value和下标的关系

易错点:

1.节点不存在,要输出不存在的结点,并结束

2.若其中一个结点是另一个结点的情况 ;和两个结点互不为祖先的情况,一定有共同祖先,因为有根嘛。

  1. #include<iostream>
  2. #include<string.h>
  3. #include<map>
  4. #define MAXN 10005
  5. using namespace std;
  6. map<int,int> value_index;
  7. int vis[MAXN];
  8. struct Node{
  9. int value;
  10. int left=-1,right=-1,parent=-1;//下标
  11. };
  12. struct Node node[MAXN];
  13. int inOrder[MAXN],preOrder[MAXN];
  14. int ind=0;
  15. int createTree(int left_in,int right_in,int left_pre,int right_pre){//返回下标
  16. if(left_in>right_in)return -1;
  17. int root=preOrder[left_pre];
  18. int root_pos_in=left_in;//中序序列根的下标
  19. while(inOrder[root_pos_in]!=root){
  20. root_pos_in++;
  21. }
  22. int i = ind++;
  23. value_index[root]=i;//
  24. node[i].value=root;
  25. node[i].left=createTree(left_in,root_pos_in-1, left_pre+1,left_pre+root_pos_in-left_in-1);
  26. if(node[i].left!=-1){
  27. node[node[i].left].parent=i;
  28. }
  29. node[i].right=createTree(root_pos_in+1,right_in, left_pre+root_pos_in-left_in+1, right_pre);
  30. if(node[i].right!=-1){
  31. node[node[i].right].parent=i;
  32. }
  33. return i;
  34. }
  35. int getLCA(int a,int b){//传入的是结点值,返回下标
  36. memset(vis,0,sizeof(vis));
  37. a=value_index[a];//下标
  38. b=value_index[b];
  39. while(a!=-1){
  40. vis[a]++;
  41. a=node[a].parent;
  42. }
  43. while(b!=-1){
  44. vis[b]++;
  45. if(vis[b]>1)return b;
  46. b=node[b].parent;
  47. }
  48. return -1;
  49. }
  50. int main(){
  51. int m,n;//m测试的节点对,n结点个数
  52. cin>>m>>n;
  53. for(int i=0;i<n;i++){
  54. cin>>inOrder[i];
  55. }
  56. for(int i=0;i<n;i++){
  57. cin>>preOrder[i];
  58. }
  59. //确定二叉树
  60. int root_i=createTree(0,n-1,0,n-1);
  61. //求解最近共同祖先 结点a,b。我的思路是:分别向上遍历,如果有那个结点最先被遍历两次就是最近共同祖先
  62. for(int i=0;i<m;i++){
  63. int a,b;
  64. cin>>a>>b;
  65. if(value_index.count(a)==0&&value_index.count(b)==0){
  66. printf("ERROR: %d and %d are not found.\n",a,b);
  67. continue;
  68. }
  69. else if(value_index.count(a)==0){
  70. printf("ERROR: %d is not found.\n",a);continue;
  71. }
  72. else if(value_index.count(b)==0){
  73. printf("ERROR: %d is not found.\n",b);continue;
  74. }
  75. int c=getLCA(a,b);
  76. c=node[c].value;
  77. if(vis[value_index[a]]>1){
  78. printf("%d is an ancestor of %d.\n",a,b);
  79. }
  80. else if(vis[value_index[b]]>1){
  81. printf("%d is an ancestor of %d.\n",b,a);
  82. }
  83. else {
  84. // printf("%d %d %d\n",vis[value_index[a]],vis[value_index[b]],vis[value_index[c]]);
  85. printf("LCA of %d and %d is %d.\n",a,b,c);
  86. }
  87. }
  88. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/627406
推荐阅读
相关标签
  

闽ICP备14008679号