实验报告

编写一个程序,实现二叉树的各种运算,并在此基础上设计一个程序完成如下功能:

(1)创建一棵二叉树(用键盘按照先序遍历序列输入一个字符串生成二叉树); (2)输出前序、中序、后序遍历的遍历序列;
(3)统计并输出二叉树的的结点个数; (4)输出二叉树的叶子结点的个数;(选做)

实验要求:

用键盘输入一个字符串,按照满二叉树的特点生成一棵二叉树。

测试用例要求:

如下二叉树的输入字符串为:ABD###C#E## 书写方法:碰到#说明该二叉树是一棵空树,注意分配(下面缺两个左右补两个#,缺一个左/右子树,补一个#)

image.png

二叉链表的结点类型(C++):

  1. Typedef structure tnode{
  2. int data;
  3. structure tnode *lchild, *rchild;
  4. }bitree,*bitlink ;

实验代码

用上面的二叉树作为例子:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef int Status;
  4. typedef char TElemType;
  5. #define OVERFLOW -1
  6. #define ERROR 0
  7. #define OK 1
  8. char ch;
  9. /**
  10. * 采用二叉链表的存储形式
  11. */
  12. typedef struct BiTNode
  13. {
  14. TElemType data;
  15. struct BiTNode *lchild, *rchild;
  16. }BiTNode, *BiTree;
  17. /**
  18. * 创建一棵二叉树
  19. */
  20. void CreateBiTree(BiTree &T) {
  21. //按先序次序输入二叉树中结点的值,创建二叉链表表示的二叉树T
  22. TElemType ch;
  23. cin>>ch;
  24. if(ch == '#'){//递归结束,建空树
  25. T = NULL;
  26. } else {
  27. T = new BiTNode;
  28. T->data = ch;
  29. CreateBiTree(T->lchild);
  30. CreateBiTree(T->rchild);
  31. }
  32. }
  33. /**
  34. * 先序遍历
  35. */
  36. void PreOrderTraverse(BiTree &T)
  37. {//先序遍历二叉树T的递归算法
  38. if(T) //若二叉树非空
  39. {
  40. cout << T->data << " "; //访问根结点
  41. PreOrderTraverse(T->lchild); //中序遍历左子树
  42. PreOrderTraverse(T->rchild); //中序遍历右子树
  43. }
  44. }
  45. /**
  46. * 中序遍历
  47. */
  48. void InOrderTraverse(BiTree &T) {
  49. if (T) {
  50. InOrderTraverse(T->lchild);
  51. cout << T->data << " ";
  52. InOrderTraverse(T->rchild);
  53. }
  54. }
  55. /**
  56. * 后序遍历
  57. */
  58. void PostOrderTraverse(BiTree &T)
  59. {//后序遍历二叉树T的递归算法
  60. if(T) //若二叉树非空
  61. {
  62. PostOrderTraverse(T->lchild); //中序遍历左子树
  63. PostOrderTraverse(T->rchild); //中序遍历右子树
  64. cout << T->data << " "; //访问根结点
  65. }
  66. }
  67. /**
  68. * 统计二叉树中节点个数
  69. */
  70. int NodeCount (BiTree &T) {
  71. if (T == NULL) {
  72. return 0;
  73. } else {
  74. return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
  75. }
  76. }
  77. /**
  78. * 二叉树中叶结点个数
  79. */
  80. int LeavesCount (BiTree &T) {
  81. if (T == NULL) {
  82. return 0;
  83. } else if (T->lchild == NULL && T->rchild == NULL) {
  84. return LeavesCount(T->lchild) + LeavesCount(T->rchild) + 1;
  85. }
  86. else {
  87. return LeavesCount(T->lchild) + LeavesCount(T->rchild);
  88. }
  89. }
  90. int main() {
  91. BiTree test = new BiTNode;
  92. cout << "请输入一个字符串以生成二叉树:";
  93. CreateBiTree(test);
  94. cout <<"\n"<< "先序遍历结果:";
  95. PreOrderTraverse(test);
  96. cout <<"\n"<< "中序遍历结果:";
  97. InOrderTraverse(test);
  98. cout <<"\n"<< "后序遍历结果:";
  99. PostOrderTraverse(test);
  100. cout <<"\n"<< "二叉树结点个数:"<<NodeCount(test);
  101. cout <<"\n"<< "二叉树叶结点个数:"<<LeavesCount(test);
  102. }

image.png

DFS遍历算法

DFS遍历分三种情况:先序、中序、后序 :::info 把一颗树遍历完,有下面三种方法:

  • 波兰表达式 -> 先序遍历二叉树
  • 中缀表达式 -> 中序遍历二叉树
  • 逆波兰表达式 -> 后序遍历二叉树 :::

image.png

手写例子

image.png

各种遍历结果

  • 先序:-+a*b-cd/ef
  • 中序:a+b*c-d-e/f
  • 后序:abcd-*+ef/-

前序遍历

  • 144. 二叉树的前序遍历

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @return {number[]}
    12. */
    13. var preorderTraversal = function(root) {
    14. let result = []
    15. let preorder = data => {
    16. if (data) {
    17. result.push(data.val)
    18. preorder(data.left)
    19. preorder(data.right)
    20. }
    21. }
    22. preorder(root)
    23. return result
    24. };

    中序遍历

  • 94. 二叉树的中序遍历

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @return {number[]}
    12. */
    13. var inorderTraversal = function(root) {
    14. let result = []
    15. let inorder = data => {
    16. if (data) {
    17. inorder(data.left)
    18. result.push(data.val)
    19. inorder(data.right)
    20. }
    21. }
    22. inorder(root)
    23. return result
    24. };

    后序遍历

  • 145. 二叉树的后序遍历

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @return {number[]}
    12. */
    13. var postorderTraversal = function(root) {
    14. let result = []
    15. let postorder = data => {
    16. if (data) {
    17. postorder(data.left)
    18. postorder(data.right)
    19. result.push(data.val)
    20. }
    21. }
    22. postorder(root)
    23. return result
    24. };