title: 树结构复习笔记
tags:

  • 算法
  • 数据结构
    abbrlink: 1fbca4b4
    date: 2021-11-17 20:52:32

1. 重建二叉树

输入一棵二叉树前序遍历和中序遍历的结果,重建该二叉树。

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. unordered_map<int, int> pos;
  13. vector<int> preorder, inorder;
  14. TreeNode* build(int a,int b,int x,int y){
  15. if(a>b) return NULL;
  16. auto root=new TreeNode(preorder[a]);
  17. int k=pos[root->val];
  18. root->left=build(a+1, a+1+k-1-x ,x, k-1);
  19. root->right=build(a+1+k-1-x+1, b, k+1, y);
  20. return root;
  21. }
  22. TreeNode* buildTree(vector<int>& _preorder, vector<int>& _inorder) {
  23. preorder=_preorder, inorder=_inorder;
  24. int n=inorder.size();
  25. for(int i=0;i<inorder.size();i++) pos[inorder[i]]=i;
  26. return build(0, n-1, 0, n-1);
  27. }
  28. };

7078(线索二叉树,中序遍历)

  1. #include <iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. typedef struct BThrNode{
  5. char data;
  6. struct BThrNode *lchild, *rchild;
  7. int ltag, rtag;
  8. }BThrNode, *BThrTree;
  9. BThrTree T,p;
  10. void createBTree(BThrTree &T)
  11. {
  12. char ch;
  13. cin>>ch;
  14. if(ch=='@') T=NULL;
  15. else
  16. {
  17. T=new BThrNode;
  18. T->data=ch;
  19. createBTree(T->lchild);
  20. createBTree(T->rchild);
  21. }
  22. }
  23. BThrTree pre=NULL;
  24. void InThread(BThrTree p)
  25. {
  26. if(p!=NULL)
  27. {
  28. InThread(p->lchild);
  29. if(p->lchild==NULL){p->ltag=1; p->lchild=pre;}
  30. else p->ltag=0;
  31. if(p->rchild==NULL){p->rtag=1; pre->rchild=p;}
  32. else pre->rtag=0;
  33. pre=p;
  34. InThread(p->rchild);
  35. }
  36. }
  37. void TraveBTree(BThrTree &T)
  38. {
  39. if(T)
  40. {
  41. TraveBTree(T->lchild);
  42. cout<<T->data;
  43. TraveBTree(T->rchild);
  44. }
  45. }
  46. int main()
  47. {
  48. createBTree(T);
  49. InThread(p);
  50. TraveBTree(T);
  51. return 0;
  52. }

7079(中序遍历)

  1. #include <iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. typedef struct BTNode{
  5. char data;
  6. struct BTNode *lchild, *rchild;
  7. //int ltag, rtag;
  8. }BTNode, *BTree;
  9. BTree T;
  10. void createBTree(BTree &T)
  11. {
  12. char ch;
  13. cin>>ch;
  14. if(ch=='@') T=NULL;
  15. else
  16. {
  17. T=new BTNode;
  18. T->data=ch;
  19. createBTree(T->lchild);
  20. createBTree(T->rchild);
  21. }
  22. }
  23. //void InThread(BThrTree p)
  24. //{
  25. // if(p!=NULL)
  26. // {
  27. // InThread(p->lchild);
  28. // if(p->lchild==NULL){p->ltag=1; p->lchild=pre;}
  29. // else p->ltag=0;
  30. // if(p->rchild==NULL){p->rtag=1; pre->rchild=p;}
  31. // else pre->rtag=0;
  32. // pre=p;
  33. // InThread(p->rchild);
  34. // }
  35. //}
  36. void TraveBTree(BTree &T)
  37. {
  38. if(T)
  39. {
  40. TraveBTree(T->lchild);
  41. cout<<T->data;
  42. TraveBTree(T->rchild);
  43. }
  44. }
  45. int main()
  46. {
  47. createBTree(T);
  48. TraveBTree(T);
  49. return 0;
  50. }

7077(层次遍历)

  1. #include <iostream>
  2. #include<cstdio>
  3. #include <queue>
  4. using namespace std;
  5. const int MAX_SIZE=1010;
  6. typedef struct BTNode{
  7. char data;
  8. struct BTNode *lchild, *rchild;
  9. //int ltag, rtag;
  10. }BTNode, *BTree;
  11. typedef struct {
  12. BTNode data[MAX_SIZE];
  13. int front,rear;
  14. }SQ;
  15. BTree T;
  16. void createBTree(BTree &T)
  17. {
  18. char ch;
  19. cin>>ch;
  20. if(ch=='@') T=NULL;
  21. else
  22. {
  23. T=new BTNode;
  24. T->data=ch;
  25. createBTree(T->lchild);
  26. createBTree(T->rchild);
  27. }
  28. }
  29. //void InThread(BThrTree p)
  30. //{
  31. // if(p!=NULL)
  32. // {
  33. // InThread(p->lchild);
  34. // if(p->lchild==NULL){p->ltag=1; p->lchild=pre;}
  35. // else p->ltag=0;
  36. // if(p->rchild==NULL){p->rtag=1; pre->rchild=p;}
  37. // else pre->rtag=0;
  38. // pre=p;
  39. // InThread(p->rchild);
  40. // }
  41. //}
  42. void TraveBTree(BTree &T)
  43. {
  44. BTree p;
  45. queue<BTree> Q;
  46. if(T)
  47. {
  48. Q.push(T);
  49. while (!Q.empty())
  50. {
  51. p=Q.front();
  52. cout<<p->data;
  53. Q.pop();
  54. if(p->lchild) Q.push(p->lchild);
  55. if(p->rchild) Q.push(p->rchild);
  56. }
  57. }
  58. }
  59. int main()
  60. {
  61. createBTree(T);
  62. TraveBTree(T);
  63. return 0;
  64. }

7080(父亲孩子表示法)

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. typedef struct BTNode{
  5. char data;
  6. struct BTNode *lchild, *rchild;
  7. }BTNode, *BTree;
  8. BTree T;
  9. void createBTree(BTree &T)
  10. {
  11. char ch;
  12. cin>>ch;
  13. if(ch=='@') T=NULL;
  14. else
  15. {
  16. T=new BTNode;
  17. T->data=ch;
  18. createBTree(T->lchild);
  19. createBTree(T->rchild);
  20. }
  21. }
  22. int Trave(BTree T)
  23. {
  24. //int num=0;
  25. if(!T) return 0;
  26. else
  27. {
  28. if(T->lchild==NULL && T->rchild==NULL) return 1;
  29. else return Trave(T->lchild)+ Trave(T->rchild);
  30. }
  31. return 0;
  32. }
  33. int Depth(BTree &T)
  34. {
  35. int m,n;
  36. if(T==NULL) return 0;
  37. else
  38. {
  39. m= Depth(T->lchild);
  40. n= Depth(T->rchild);
  41. if(m>n) return m+1;
  42. else return n+1;
  43. }
  44. }
  45. int CountLeaf(BTree &T)
  46. {
  47. int ans=0;
  48. if(T==NULL) return 0;
  49. if(T->lchild==NULL) return CountLeaf(T->rchild)+1;
  50. else
  51. return CountLeaf(T->lchild)+ CountLeaf(T->rchild);
  52. }
  53. int main()
  54. {
  55. createBTree(T);
  56. //int ans= Depth(T);
  57. cout<<CountLeaf(T)<<endl;
  58. return 0;
  59. }