当前位置:   article > 正文

头歌数据结构——二叉树及其应用_头歌二叉树及其应用答案

头歌二叉树及其应用答案

 第1关:实现二叉树的创建

  1. #include "binary_tree.h"
  2. BiTreeNode* CreatBiTree(char* s, int &i, int len)
  3. // 利用先序遍历创建二叉树
  4. // 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
  5. // 返回:二叉树
  6. {
  7. // 请在这里补充代码,完成本关任务
  8. /********** Begin *********/
  9. BiTreeNode* T;
  10. if(i<=len && s[i]=='#')
  11. {
  12. i++;
  13. T=NULL;
  14. }
  15. else
  16. {
  17. T=(BiTreeNode*)malloc(sizeof(BiTreeNode));
  18. T->data=s[i++];
  19. T->left=CreatBiTree(s,i,len);
  20. T->right=CreatBiTree(s,i,len);
  21. }
  22. return T;
  23. /********** End **********/
  24. }
  25. void InOrder(BiTreeNode* root)
  26. // 二叉树的中序遍历
  27. // 参数:二叉树根节点root
  28. // 输出:中间没有空格,末尾不换行。
  29. {
  30. // 请在这里补充代码,完成本关任务
  31. /********** Begin *********/
  32. if(root!=NULL)
  33. {
  34. InOrder(root->left);
  35. printf("%c",root->data);
  36. InOrder(root->right);
  37. }
  38. /********** End **********/
  39. }

第2关:计算二叉树的深度和节点个数

  1. #include "binary_tree.h"
  2. int GetTreeDepth(BiTreeNode* root)
  3. // 计算该二叉树的深度
  4. // 参数:二叉树根节点root
  5. // 返回:二叉树的深度
  6. {
  7. // 请在这里补充代码,完成本关任务
  8. /********** Begin *********/
  9. int m,n;
  10. if(root==NULL)
  11. {
  12. return 0;
  13. }
  14. else{
  15. m=GetTreeDepth(root->right);
  16. n=GetTreeDepth(root->left);
  17. if(m>n)
  18. return m+1;
  19. else
  20. return n+1;
  21. }
  22. /********** End **********/
  23. }
  24. int GetNodeNumber(BiTreeNode* root)
  25. // 计算该二叉树的总节点个数
  26. // 参数:二叉树根节点root
  27. // 返回:二叉树的总节点个数
  28. {
  29. // 请在这里补充代码,完成本关任务
  30. /********** Begin *********/
  31. if(root==NULL)
  32. {
  33. return 0;
  34. }
  35. else
  36. return GetNodeNumber(root->left)+GetNodeNumber(root->right)+1;
  37. /********** End **********/
  38. }
  39. int GetLeafNodeNumber(BiTreeNode* root)
  40. // 计算该二叉树的叶子节点个数
  41. // 参数:二叉树根节点root
  42. // 返回:二叉树的叶子节点个数
  43. {
  44. // 请在这里补充代码,完成本关任务
  45. /********** Begin *********/
  46. if(root==NULL)
  47. return 0;
  48. else if(root->left==NULL&&root->right==NULL)
  49. return 1;
  50. else
  51. return GetLeafNodeNumber(root->left)+GetLeafNodeNumber(root->right);
  52. /********** End **********/
  53. }

第3关:递归实现二叉树左右子树交换

  1. #include "binary_tree.h"
  2. BiTreeNode* BiTreeChange(BiTreeNode* root)
  3. // 实现二叉树左右子树的交换(递归法)
  4. // 参数:二叉树根节点root
  5. // 返回:二叉树
  6. {
  7. // 请在这里补充代码,完成本关任务
  8. /********** Begin *********/
  9. int max=1000;
  10. BiTreeNode* s[max];
  11. int k=0;
  12. s[k]=0;
  13. if(root)
  14. {
  15. k++;
  16. s[k]=root->left;
  17. root->left=root->right;
  18. root->right=s[k];
  19. root->left=BiTreeChange(root->left);
  20. root->right=BiTreeChange(root->right);
  21. k++;
  22. }
  23. return root;
  24. /********** End **********/
  25. }
  26. void PreOrder(BiTreeNode* root)
  27. // 二叉树的前序遍历
  28. // 参数:二叉树根节点root
  29. // 输出:二叉树的前序遍历,中间没有空格,末尾不换行。
  30. {
  31. // 请在这里补充代码,完成本关任务
  32. /********** Begin *********/
  33. if(root)
  34. {
  35. printf("%c",root->data);
  36. PreOrder(root->left);
  37. PreOrder(root->right);
  38. }
  39. /********** End **********/
  40. }

第4关:非递归实现二叉树左右子树交换

  1. #include "binary_tree.h"
  2. BiTreeNode* BiTreeChangeStack(BiTreeNode* root)
  3. // 实现二叉树左右子树的交换(栈实现)
  4. // 参数:二叉树根节点root
  5. // 返回:二叉树
  6. {
  7. // 请在这里补充代码,完成本关任务
  8. /********** Begin *********/
  9. stack<BiTreeNode*> s;
  10. BiTreeNode *temp=NULL,*node=root;
  11. if(root==NULL)
  12. return NULL;
  13. s.push(root);
  14. while(!s.empty())
  15. {
  16. temp=node->left;
  17. node->left=node->right;
  18. node->right=temp;
  19. if(node->right)
  20. {
  21. s.push(node->right);
  22. }
  23. if(node->left)
  24. {
  25. node=node->left;
  26. }else{
  27. node=s.top();
  28. s.pop();
  29. }
  30. }
  31. return node;
  32. /********** End **********/
  33. }
  34. void PostOrder(BiTreeNode* root)
  35. // 二叉树的后序遍历
  36. // 参数:二叉树根节点root
  37. // 输出:二叉树的后序遍历,中间没有空格,末尾不换行。
  38. {
  39. // 请在这里补充代码,完成本关任务
  40. /********** Begin *********/
  41. if(root->left)
  42. {
  43. PostOrder(root->left);
  44. }
  45. if(root->right)
  46. {
  47. PostOrder(root->right);
  48. }
  49. printf("%c",root->data);
  50. /********** End **********/
  51. }

第5关:层次遍历二叉树

  1. #include "binary_tree.h"
  2. void HierarchyOrder(BiTreeNode* root)
  3. // 二叉树的层次遍历(队列实现)
  4. // 参数:二叉树根节点root
  5. // 输出:二叉树的层次遍历,中间没有空格,末尾不换行。
  6. {
  7. // 请在这里补充代码,完成本关任务
  8. /********** Begin *********/
  9. queue<BiTreeNode*> q;
  10. if(root!=NULL)
  11. {
  12. q.push(root);
  13. }
  14. while(!q.empty())
  15. {
  16. printf("%c",q.front()->data);
  17. if(q.front()->left != NULL)
  18. {
  19. q.push(q.front()->left);
  20. }
  21. if(q.front()->right != NULL)
  22. {
  23. q.push(q.front()->right);
  24. }
  25. q.pop();
  26. }
  27. /********** End **********/
  28. }

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

闽ICP备14008679号