• 【考研数据结构代码题6】构建二叉树及四大遍历(先中后层)


    题目:请你编写完整的程序构建一棵二叉树并对其进行先序遍历、中序遍历、后序遍历与层次遍历,分别打印并输出遍历结果

    难度:★★★

    二叉树的存储结构

    1. typedef struct Node{
    2. char data;//数据域
    3. struct Node* left;//左子树
    4. struct Node* right;//右子树
    5. }BiNode,*BiTree;//二叉链表

    二叉树的构建

            按照先序遍历的的顺序逐个输入结点的值来构建二叉树,其中,以字符‘#’表示该结点为叶子结点,即没有左右孩子,递归地构建左子树与右子树。

    1. void CreateBiTree(BiTree &T)
    2. {
    3. //按先序序列输入二叉树中的结点值
    4. char key;
    5. printf("请先序输入字符:");
    6. scanf("%c",&key);
    7. //输入#代表该结点为叶子结点,结束插入
    8. if(key == '#') T = NULL;
    9. else
    10. {
    11. //分配空间创建新结点
    12. T = (BiNode*) malloc (sizeof(BiNode));
    13. T->data = key;
    14. CreateBiTree(T->left) ; //构造左子树
    15. CreateBiTree(T->right) ;//构造右子树
    16. }
    17. }

     二叉树先序遍历

    1. //先序遍历(根左右)
    2. void PreOrder(BiTree T){
    3. if(T){
    4. visit(T);
    5. PreOrder(T->left);
    6. PreOrder(T->right);
    7. }
    8. }

     二叉树中序遍历

    1. //中序遍历(左根右)
    2. void InOrder(BiTree T){
    3. if(T){
    4. InOrder(T->left);
    5. visit(T);
    6. InOrder(T->right);
    7. }
    8. }

     二叉树后序遍历

    1. //后序遍历(左右根)
    2. void PostOrder(BiTree T){
    3. if(T){
    4. PostOrder(T->left);
    5. PostOrder(T->right);
    6. visit(T);
    7. }
    8. }

      二叉树层次遍历

    1. //层次遍历(自上而下,从左到右)
    2. void LevelOrder(BiTree T){
    3. InitQueue(Q);//初始化一个队列
    4. BiTree p;//p为当前遍历的结点
    5. EnQueue(Q,p);//根节点入队
    6. while(!IsEmpty(Q)){
    7. DeQueue(Q,p);
    8. visit(p);
    9. if(p->left!=NULL){
    10. //左孩子入队
    11. EnQueue(Q,p->left);
    12. }
    13. if(p->right!=NULL){
    14. //右孩子入队
    15. EnQueue(Q,p->right);
    16. }
    17. }
    18. }

    完整代码

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. typedef struct Node{
    6. char data;
    7. struct Node* left;
    8. struct Node* right;
    9. }BiNode,*BiTree;
    10. //构建二叉树
    11. void CreateBiTree(BiTree &T)
    12. {
    13. //按先序序列输入二叉树中的结点值
    14. char key;
    15. printf("请先序输入字符:");
    16. scanf("%c",&key);
    17. //输入#代表该结点为叶子结点,结束插入
    18. if(key == '#') T = NULL;
    19. else
    20. {
    21. //分配空间创建新结点
    22. T = (BiNode*) malloc (sizeof(BiNode));
    23. T->data = key;
    24. CreateBiTree(T->left) ; //构造左子树
    25. CreateBiTree(T->right) ;//构造右子树
    26. }
    27. }
    28. //访问并输出根结点
    29. void visit(BiTree T){
    30. cout<data<<" ";
    31. }
    32. //先序遍历:DLR
    33. void PreOrder(BiTree T){
    34. if(T){
    35. visit(T);
    36. PreOrder(T->left);
    37. PreOrder(T->right);
    38. }
    39. }
    40. //中序遍历:LDR
    41. void InOrder(BiTree T){
    42. if(T){
    43. InOrder(T->left);
    44. visit(T);
    45. InOrder(T->right);
    46. }
    47. }
    48. //后序遍历:LRD
    49. void PostOrder(BiTree T){
    50. if(T){
    51. PostOrder(T->left);
    52. PostOrder(T->right);
    53. visit(T);
    54. }
    55. }
    56. //层序遍历
    57. void LevelOrder(BiTree T){
    58. if(T==NULL) return ;
    59. queueque;
    60. que.push(T);
    61. while(!que.empty()){
    62. BiTree ptr=que.front();
    63. cout<data<<" ";
    64. que.pop();
    65. if(ptr->left!=NULL)
    66. que.push(ptr->left);
    67. if(ptr->right!=NULL)
    68. que.push(ptr->right);
    69. }
    70. }
    71. int main(){
    72. BiTree T;
    73. CreateBiTree(T);
    74. cout<<"二叉树构建完成!"<
    75. cout<<"先序遍历:";PreOrder(T);cout<
    76. cout<<"中序遍历:";InOrder(T);cout<
    77. cout<<"后序遍历:";PostOrder(T);cout<
    78. cout<<"层序遍历:";LevelOrder(T);cout<
    79. return 0;
    80. }

    机算结果

    手算结果

  • 相关阅读:
    Android 开发技巧:音乐播放器的后台处理【Service、Handler、MediaPlayer】
    学习css 伪类:has
    【附源码】计算机毕业设计JAVA计算机系教师教研科研管理系统
    特殊类的设计
    Docker - 私有云、数据卷、网络
    【算法】单调栈
    基于uni-app与图鸟UI打造的各领域移动端模板大赏
    燃气管网监测系统,让城市生命线更安全
    leetcode_2909元素和最小的山形三元组
    npm发布自己的包
  • 原文地址:https://blog.csdn.net/qq_52487066/article/details/134404433