title: 【树】构建二叉搜索树
tags:

  • 每日一题
  • leetcode
  • acwing

  • abbrlink: 9e5e150
    date: 2021-04-29 18:25:53

LeetCode 938.二叉搜索树的范围和

思路

递归就完事了

C++代码

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. int rangeSumBST(TreeNode* root, int low, int high) {
  15. if(!root) return 0;
  16. if(root->val > high) return rangeSumBST(root->left, low, high);
  17. if(root->val < low) return rangeSumBST(root->right, low, high);
  18. return root->val+rangeSumBST(root->left, low, high)+rangeSumBST(root->right, low, high);
  19. }
  20. };

AcWing 1589. 构建二叉搜索树

思路

先将所有节点(包括新加入的)排序后再按照层序遍历输出就可以得解
有两种写法,一种是把树/队列用数组模拟出来即可,另外一种是把真正的树结构和队列结构都用起来

C++代码1(模拟树+模拟队列法)

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=110;
  6. int n;
  7. int w[N], l[N], r[N];
  8. int a[N], q[N];
  9. void dfs(int u,int& k)
  10. {
  11. if(u==-1) return;
  12. dfs(l[u], k);
  13. w[u]=a[k++];
  14. dfs(r[u], k);
  15. }
  16. void bfs()
  17. {
  18. int hh=0, tt=0;
  19. q[0]=0;
  20. while(hh<=tt)//队列不空
  21. {
  22. int t=q[hh++];//取出队头
  23. printf("%d ", w[t]);
  24. if(l[t]!=-1)//如果有左儿子
  25. q[++tt]=l[t];
  26. if(r[t]!=-1)//如果有右儿子
  27. q[++tt]=r[t];
  28. }
  29. }
  30. int main()
  31. {
  32. scanf("%d", &n);
  33. for(int i=0;i<n;i++)
  34. scanf("%d%d", &l[i], &r[i]);
  35. for(int i=0;i<n;i++)
  36. scanf("%d", &a[i]);
  37. sort(a, a+n);
  38. int k=0;
  39. dfs(0, k);
  40. bfs();
  41. return 0;
  42. }

C++代码2(树+队列法)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct TreeNode{ //建立数据结构
  4. int val;
  5. int left;
  6. int right;
  7. }root[110]; //节点数组
  8. int n,co;
  9. int num[110];
  10. vector<int> ans;
  11. void dfs(int u) //中序遍历把值赋给root[].val
  12. {
  13. if(u==-1) return ;
  14. dfs(root[u].left);
  15. root[u].val=num[co++];
  16. dfs(root[u].right);
  17. }
  18. void bfs() //层序遍历存储答案输出的值的顺序
  19. {
  20. queue<TreeNode> q;
  21. q.push(root[0]);
  22. while(q.size())
  23. {
  24. auto t = q.front();
  25. q.pop();
  26. ans.push_back(t.val);
  27. if(t.left!=-1) q.push(root[t.left]);
  28. if(t.right!=-1) q.push(root[t.right]);
  29. }
  30. }
  31. int main()
  32. {
  33. cin>>n;
  34. int l,r;
  35. for(int i=0;i<n;i++)
  36. {
  37. cin>>l>>r;
  38. root[i].left=l;
  39. root[i].right=r;
  40. }
  41. for(int i=0;i<n;i++) cin>>num[i];
  42. sort(num,num+n); //将输入的数组元素从小到大排列,用来匹配二叉搜索树的赋值情况
  43. dfs(0);
  44. bfs();
  45. int f=0;
  46. for(auto x:ans)
  47. {
  48. if(f) cout<<" ";
  49. cout<<x;
  50. f=1;
  51. }
  52. return 0;
  53. }