当前位置:   article > 正文

构建二叉搜索树_现在需要将全部积木摆成二叉搜索树的形状,使积木编号符合二叉搜索树规则,请设

现在需要将全部积木摆成二叉搜索树的形状,使积木编号符合二叉搜索树规则,请设

二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
  • 若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值
  • 它的左、右子树也分别为二叉搜索树

给定二叉树的具体结构以及一系列不同的整数,只有一种方法可以将这些数填充到树中,以使结果树满足 BST 的定义。

请你输出结果树的层序遍历

示例如图 1 和图 2 所示。

输入格式

第一行包含一个正整数 N,表示树的结点个数。

所有结点的编号为 0∼N−1,并且编号为 0 的结点是根结点。

接下来 N 行,第 i 行(从 0 计数)包含结点 i 的左右子结点编号。如果该结点的某个子结点不存在,则用 −1 表示。

最后一行,包含 N 个不同的整数,表示要插入树中的数值。

输出格式

输出结果树的层序遍历序列。

数据范围

1≤N≤100

输入样例:

  1. 9
  2. 1 6
  3. 2 3
  4. -1 -1
  5. -1 4
  6. 5 -1
  7. -1 -1
  8. 7 -1
  9. -1 8
  10. -1 -1
  11. 73 45 11 58 82 25 67 38 42

输出样例:

58 25 82 11 38 67 45 73 42

最近每天都会写2-3道题保持手感,遇到好的题就会上传~ 

分析:之前从来没有系统的写过树的题,感觉像这种二叉搜索树的题应该是有板子的,我是按照自己对这道题的理解,用函数dfs1,求出每一个节点的左子树有几个节点,这个是用来确定该节点应该填哪个数用的 ,因为假设根节点的左子树有5个节点,那我们就可以知道根节点是第6大的数,我们就可以把c[6]赋值给根节点,因此我们还要把输入的c[]数组排一下序,填每个节点的值时,我用了dfs函数,深度遍历填写的,这里需要注意的时,一个节点的左子树有k个节点不代表该节点就填c[k](从0到n-1的下标),这只能说明该节点在以该节点为根节点的树中排第k+1,因此dfs函数还要添加参数ll,rr作为左右范围。最后用一个bfs遍历输出答案,因为要求的是层序遍历结果。

代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct node{
  4. int l,r,id;
  5. int w;
  6. }adj[110];
  7. int n,a,b;
  8. int c[101],st[101],al[101];
  9. int dfs1(int id)
  10. {
  11. int ll=0,rr=0;
  12. if(adj[id].l) ll = dfs1(adj[id].l);
  13. if(adj[id].r) rr = dfs1(adj[id].r);
  14. al[id]=ll;
  15. return ll+rr+1;
  16. }
  17. void dfs(int id,int ll,int rr)
  18. {
  19. //cout<<id<<" ";
  20. int num=al[id];
  21. adj[id].w=c[num+ll];
  22. if(adj[id].l) dfs(adj[id].l,ll,num+ll-1);
  23. if(adj[id].r) dfs(adj[id].r,num+ll+1,rr);
  24. }
  25. void bfs()
  26. {
  27. queue<int>q;
  28. q.push(0);
  29. while(q.size())
  30. {
  31. int u=q.front();
  32. q.pop();
  33. cout<<adj[u].w<<" ";
  34. if(adj[u].l)q.push(adj[u].l);
  35. if(adj[u].r)q.push(adj[u].r);
  36. }
  37. }
  38. int main()
  39. {
  40. cin>>n;
  41. for(int i=0;i<n;i++)
  42. {
  43. cin>>a>>b;
  44. if(a!=-1) adj[i].l=a;
  45. if(b!=-1) adj[i].r=b;
  46. }
  47. for(int i=0;i<n;i++) cin>>c[i];
  48. dfs1(0);
  49. sort(c,c+n);
  50. dfs(0,0,n-1);
  51. bfs();
  52. return 0;
  53. }

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

闽ICP备14008679号