• 数据结构C++——二叉树的实现


    目录

    二叉树的实现(出错版)

    但是VS出现错误

    全部代码:

    运行结果:

    补充计算叶子结点的个数方法后: 

    结果: 

     补充计算二叉树深度方法:

    运行结果:

    补充计算二叉树结点个数方法:(R+L+D=结点个数)

    运行结果:

    二叉树相关方法大实现: 

    运行结果:


    二叉树的实现(出错版)

    1. /*
    2. * 二叉树的使用
    3. */
    4. /*
    5. * 二叉树的结点结构
    6. */
    7. struct BiNode {
    8. char data;
    9. BiNode* lchid,*rchid;
    10. };
    11. /*
    12. * 二叉链表的实现
    13. */
    14. class BiTree {
    15. private:
    16. BiNode* Creat();
    17. void Release(BiNode* bt);
    18. void PreOrder(BiNode* bt);
    19. void InOrder(BiNode* bt);
    20. void PostOrder(BiNode* bt);
    21. BiNode* root;//指向根结点的头指针
    22. public:
    23. BiTree(){}
    24. BiTree() {
    25. root = Creat();
    26. }
    27. ~BiTree() {
    28. Release(root);
    29. }
    30. //前序遍历二叉树
    31. void PreOrder() {
    32. PreOrder(root);
    33. }
    34. //中序遍历二叉树
    35. void InOrder() {
    36. InOrder(root);
    37. }
    38. //后序遍历二叉树
    39. void PostOrder() {
    40. PostOrder(root);
    41. }
    42. //层序二叉树
    43. void LevelOrder();
    44. };
    45. //层序遍历二叉树
    46. void BiTree::LevelOrder() {
    47. BiNode* Q[100], * q = nullptr;
    48. int font = -1, rear = -1;//队列初始化
    49. if (root == nullptr)
    50. return;
    51. Q[++rear] = root;//根指针入队
    52. while (font!=rear)
    53. {
    54. q = Q[++font];//出队
    55. cout << q->data<<"\t";
    56. if (q->lchid != nullptr)
    57. Q[++rear] = q->lchid;
    58. if (q->rchid != nullptr)
    59. Q[++rear] = q->rchid;
    60. }
    61. }
    62. //前序遍历
    63. void BiTree::PreOrder(BiNode* bt) {
    64. if (bt == nullptr)
    65. return;
    66. else {
    67. cout << bt->data;
    68. cout << endl; //访问根结点bt的数据域
    69. PreOrder(bt->lchid); //前序递归遍历bt的左子树
    70. PreOrder(bt->rchid); //前序递归遍历bt的右子树
    71. }
    72. }
    73. //中序遍历
    74. void BiTree::InOrder(BiNode*bt) {
    75. if (bt == nullptr)
    76. return;
    77. else
    78. {
    79. InOrder(bt->lchid); //中序递归遍历bt的左子树
    80. cout << bt->data; //访问根结点bt的数据域
    81. InOrder(bt->rchid); //中序递归遍历bt的右子树
    82. }
    83. }
    84. //后序遍历
    85. void BiTree::PostOrder(BiNode* bt) {
    86. if (bt == nullptr)
    87. return;
    88. else{
    89. PostOrder(bt->lchid); //后序递归遍历bt的左子树
    90. PostOrder(bt->rchid); //后序递归遍历bt的右子树
    91. cout << bt->data; //访问根结点bt的数据域
    92. }
    93. }
    94. //建立二叉树
    95. BiNode* BiTree::Creat() {
    96. BiNode* bt;
    97. char ch;
    98. cin >> ch; //输入结点的数据信息,假设为字符
    99. if (ch == '#') //建立一个空树
    100. bt = nullptr;
    101. else{
    102. bt = new BiNode;
    103. bt->data = ch;
    104. bt->lchid = Creat();//递归建立左子树
    105. bt->rchid = Creat();//递归建立右子树
    106. }
    107. return bt;
    108. }
    109. #include
    110. using namespace std;
    111. int mian() {
    112. BiTree T{};//定义对象变量 T
    113. cout << "该二叉树的前序遍历序列为:";
    114. T.PreOrder();
    115. cout << endl;
    116. cout << "该二叉树的中序遍历序列为:";
    117. T.InOrder();
    118. cout << endl;
    119. cout << "该二叉树的后序遍历序列为:";
    120. T.PostOrder();
    121. cout << endl;
    122. cout << "该二叉树的层序遍历序列为:";
    123. T.LevelOrder();
    124. cout << endl;
    125. system("pause");
    126. return 0;
    127. }

    但是VS出现错误

    全部代码:

    更改后: 

    1. /*
    2. * 二叉树的使用
    3. */
    4. #include
    5. #include
    6. using namespace std;
    7. /*
    8. * 二叉树的结点结构
    9. */
    10. struct BiNode {
    11. char data;
    12. BiNode* lchid,*rchid;
    13. };
    14. /*
    15. * 二叉链表的实现
    16. */
    17. class BiTree {
    18. private:
    19. BiNode* Creat();
    20. void Release(BiNode* bt);
    21. void PreOrder(BiNode* bt);
    22. void InOrder(BiNode* bt);
    23. void PostOrder(BiNode* bt);
    24. BiNode* root;//指向根结点的头指针
    25. public:
    26. BiTree() {
    27. root = Creat();
    28. }
    29. ~BiTree() {
    30. Release(root);
    31. }
    32. //前序遍历二叉树
    33. void PreOrder() {
    34. PreOrder(root);
    35. }
    36. //中序遍历二叉树
    37. void InOrder() {
    38. InOrder(root);
    39. }
    40. //后序遍历二叉树
    41. void PostOrder() {
    42. PostOrder(root);
    43. }
    44. //层序二叉树
    45. void LevelOrder();
    46. };
    47. //建立二叉树
    48. BiNode* BiTree::Creat()
    49. {
    50. BiNode* bt;
    51. cout << "请依次输入二叉树序列:" << endl;
    52. char ch;
    53. cin >> ch; //输入结点的数据信息,假设为字符
    54. if (ch == '#') //建立一个空树
    55. bt = nullptr;
    56. else {
    57. bt = new BiNode;
    58. bt->data = ch;
    59. bt->lchid = Creat();//递归建立左子树
    60. bt->rchid = Creat();//递归建立右子树
    61. }
    62. return bt;
    63. }
    64. //销毁二叉树
    65. void BiTree::Release(BiNode* bt) {
    66. if (bt == nullptr)
    67. return;
    68. else {
    69. Release(bt->lchid); //释放左子树
    70. Release(bt->rchid); //释放右子树
    71. delete bt; //释放根结点
    72. }
    73. }
    74. //层序遍历二叉树
    75. void BiTree::LevelOrder() {
    76. BiNode* Q[100], * q = nullptr;
    77. int font = -1, rear = -1;//队列初始化
    78. if (root == nullptr)
    79. return;
    80. Q[++rear] = root;//根指针入队
    81. while (font!=rear)
    82. {
    83. q = Q[++font];//出队
    84. cout << q->data<<"\t";
    85. if (q->lchid != nullptr)
    86. Q[++rear] = q->lchid;
    87. if (q->rchid != nullptr)
    88. Q[++rear] = q->rchid;
    89. }
    90. }
    91. //前序遍历
    92. void BiTree::PreOrder(BiNode* bt) {
    93. if (bt == nullptr)
    94. return;
    95. else {
    96. std::cout << bt->data; //访问根结点bt的数据域
    97. PreOrder(bt->lchid); //前序递归遍历bt的左子树
    98. PreOrder(bt->rchid); //前序递归遍历bt的右子树
    99. }
    100. }
    101. //中序遍历
    102. void BiTree::InOrder(BiNode*bt) {
    103. if (bt == nullptr)
    104. return;
    105. else
    106. {
    107. InOrder(bt->lchid); //中序递归遍历bt的左子树
    108. cout << bt->data; //访问根结点bt的数据域
    109. InOrder(bt->rchid); //中序递归遍历bt的右子树
    110. }
    111. }
    112. //后序遍历
    113. void BiTree::PostOrder(BiNode* bt) {
    114. if (bt == nullptr)
    115. return;
    116. else{
    117. PostOrder(bt->lchid); //后序递归遍历bt的左子树
    118. PostOrder(bt->rchid); //后序递归遍历bt的右子树
    119. cout << bt->data; //访问根结点bt的数据域
    120. }
    121. }
    122. int main() {
    123. BiTree T{};//定义对象变量 T
    124. std::cout << "该二叉树的前序遍历序列为:";
    125. T.PreOrder();
    126. std::cout << endl;
    127. std::cout << "该二叉树的中序遍历序列为:";
    128. T.InOrder();
    129. std::cout << endl;
    130. std::cout << "该二叉树的后序遍历序列为:";
    131. T.PostOrder();
    132. std::cout << endl;
    133. std::cout << "该二叉树的层序遍历序列为:";
    134. T.LevelOrder();
    135. std::cout << endl;
    136. system("pause");
    137. return 0;
    138. }

    运行结果:

    补充计算叶子结点的个数方法后: 

    1. /*
    2. * 二叉树的使用
    3. */
    4. #include
    5. #include
    6. using namespace std;
    7. /*
    8. * 二叉树的结点结构
    9. */
    10. struct BiNode {
    11. char data;
    12. BiNode* lchid, * rchid;
    13. };
    14. /*
    15. * 二叉链表的实现
    16. */
    17. class BiTree {
    18. private:
    19. BiNode* Creat();
    20. void Release(BiNode* bt);
    21. void PreOrder(BiNode* bt);
    22. void InOrder(BiNode* bt);
    23. void PostOrder(BiNode* bt);
    24. int LeafCount(BiNode* bt);
    25. BiNode* root;//指向根结点的头指针
    26. public:
    27. BiTree() {
    28. root = Creat();
    29. }
    30. ~BiTree() {
    31. Release(root);
    32. }
    33. //前序遍历二叉树
    34. void PreOrder() {
    35. PreOrder(root);
    36. }
    37. //中序遍历二叉树
    38. void InOrder() {
    39. InOrder(root);
    40. }
    41. //后序遍历二叉树
    42. void PostOrder() {
    43. PostOrder(root);
    44. }
    45. //层序二叉树
    46. void LevelOrder();
    47. //计算二叉树叶子结点个数
    48. void LeafCount() {
    49. cout<<LeafCount(root);
    50. }
    51. };
    52. //建立二叉树
    53. BiNode* BiTree::Creat()
    54. {
    55. BiNode* bt;
    56. //cout << "请依次输入二叉树序列:" << endl;
    57. char ch;
    58. cin >> ch; //输入结点的数据信息,假设为字符
    59. if (ch == '#') //建立一个空树
    60. bt = nullptr;
    61. else {
    62. bt = new BiNode;//开辟空间
    63. bt->data = ch; //树根
    64. bt->lchid = Creat();//递归建立左子树
    65. bt->rchid = Creat();//递归建立右子树
    66. }
    67. return bt;
    68. }
    69. //销毁二叉树(后序消除法)
    70. void BiTree::Release(BiNode* bt) {
    71. if (bt == nullptr)
    72. return;
    73. else {
    74. Release(bt->lchid); //释放左子树
    75. Release(bt->rchid); //释放右子树
    76. delete bt; //释放根结点
    77. }
    78. }
    79. //层序遍历二叉树
    80. void BiTree::LevelOrder() {
    81. BiNode* Q[100], * q = nullptr;
    82. int font = -1, rear = -1;//队列初始化
    83. if (root == nullptr)
    84. return;
    85. Q[++rear] = root;//根指针入队
    86. while (font != rear)
    87. {
    88. q = Q[++font];//出队
    89. cout << q->data << "\t";
    90. if (q->lchid != nullptr)
    91. Q[++rear] = q->lchid;
    92. if (q->rchid != nullptr)
    93. Q[++rear] = q->rchid;
    94. }
    95. }
    96. //前序遍历
    97. void BiTree::PreOrder(BiNode* bt) {
    98. if (bt == nullptr)
    99. return;
    100. else {
    101. std::cout << bt->data; //访问根结点bt的数据域
    102. PreOrder(bt->lchid); //前序递归遍历bt的左子树
    103. PreOrder(bt->rchid); //前序递归遍历bt的右子树
    104. }
    105. }
    106. //中序遍历
    107. void BiTree::InOrder(BiNode* bt) {
    108. if (bt == nullptr)
    109. return;
    110. else
    111. {
    112. InOrder(bt->lchid); //中序递归遍历bt的左子树
    113. cout << bt->data; //访问根结点bt的数据域
    114. InOrder(bt->rchid); //中序递归遍历bt的右子树
    115. }
    116. }
    117. //后序遍历
    118. void BiTree::PostOrder(BiNode* bt) {
    119. if (bt == nullptr)
    120. return;
    121. else {
    122. PostOrder(bt->lchid); //后序递归遍历bt的左子树
    123. PostOrder(bt->rchid); //后序递归遍历bt的右子树
    124. cout << bt->data; //访问根结点bt的数据域
    125. }
    126. }
    127. //计算该二叉树的叶子结点个数
    128. int BiTree::LeafCount(BiNode* bt) {
    129. if (bt == nullptr)
    130. return 0;
    131. if (bt->lchid == nullptr && bt->rchid == nullptr) {
    132. return 1;
    133. }
    134. else
    135. {
    136. return LeafCount(bt->lchid) + LeafCount(bt->rchid);
    137. }
    138. }
    139. int main() {
    140. //试验:输入A B # D # # C # #
    141. cout << "请依次输入二叉树序列:" << endl;
    142. BiTree T{};//定义对象变量 T
    143. std::cout << "该二叉树的前序遍历序列为:";
    144. T.PreOrder();
    145. std::cout << endl;
    146. std::cout << "叶子结点的个数为:";
    147. T.LeafCount();
    148. cout << endl;
    149. system("pause");
    150. return 0;
    151. }

    结果: 

     补充计算二叉树深度方法:

    1. /*
    2. * 二叉树的使用
    3. */
    4. #include
    5. #include
    6. using namespace std;
    7. /*
    8. * 二叉树的结点结构
    9. */
    10. struct BiNode {
    11. char data;
    12. BiNode* lchid, * rchid;
    13. };
    14. /*
    15. * 二叉链表的实现
    16. */
    17. class BiTree {
    18. private:
    19. BiNode* Creat();
    20. void Release(BiNode* bt);
    21. void PreOrder(BiNode* bt);
    22. void InOrder(BiNode* bt);
    23. void PostOrder(BiNode* bt);
    24. int Depth(BiNode* bt);
    25. int LeafCount(BiNode* bt);
    26. BiNode* root;//指向根结点的头指针
    27. public:
    28. BiTree() {
    29. root = Creat();
    30. }
    31. ~BiTree() {
    32. Release(root);
    33. }
    34. //前序遍历二叉树
    35. void PreOrder() {
    36. PreOrder(root);
    37. }
    38. //中序遍历二叉树
    39. void InOrder() {
    40. InOrder(root);
    41. }
    42. //后序遍历二叉树
    43. void PostOrder() {
    44. PostOrder(root);
    45. }
    46. //层序二叉树
    47. void LevelOrder();
    48. //计算树的深度
    49. void Depth() {
    50. cout << Depth(root);
    51. }
    52. //计算二叉树叶子结点个数
    53. void LeafCount() {
    54. cout<<LeafCount(root);
    55. }
    56. };
    57. //建立二叉树
    58. BiNode* BiTree::Creat()
    59. {
    60. BiNode* bt;
    61. //cout << "请依次输入二叉树序列:" << endl;
    62. char ch;
    63. cin >> ch; //输入结点的数据信息,假设为字符
    64. if (ch == '#') //建立一个空树
    65. bt = nullptr;
    66. else {
    67. bt = new BiNode;//开辟空间
    68. bt->data = ch; //树根
    69. bt->lchid = Creat();//递归建立左子树
    70. bt->rchid = Creat();//递归建立右子树
    71. }
    72. return bt;
    73. }
    74. //销毁二叉树(后序消除法)
    75. void BiTree::Release(BiNode* bt) {
    76. if (bt == nullptr)
    77. return;
    78. else {
    79. Release(bt->lchid); //释放左子树
    80. Release(bt->rchid); //释放右子树
    81. delete bt; //释放根结点
    82. }
    83. }
    84. //层序遍历二叉树
    85. void BiTree::LevelOrder() {
    86. BiNode* Q[100], * q = nullptr;
    87. int font = -1, rear = -1;//队列初始化
    88. if (root == nullptr)
    89. return;
    90. Q[++rear] = root;//根指针入队
    91. while (font != rear)
    92. {
    93. q = Q[++font];//出队
    94. cout << q->data << "\t";
    95. if (q->lchid != nullptr)
    96. Q[++rear] = q->lchid;
    97. if (q->rchid != nullptr)
    98. Q[++rear] = q->rchid;
    99. }
    100. }
    101. //前序遍历
    102. void BiTree::PreOrder(BiNode* bt) {
    103. if (bt == nullptr)
    104. return;
    105. else {
    106. std::cout << bt->data; //访问根结点bt的数据域
    107. PreOrder(bt->lchid); //前序递归遍历bt的左子树
    108. PreOrder(bt->rchid); //前序递归遍历bt的右子树
    109. }
    110. }
    111. //中序遍历
    112. void BiTree::InOrder(BiNode* bt) {
    113. if (bt == nullptr)
    114. return;
    115. else
    116. {
    117. InOrder(bt->lchid); //中序递归遍历bt的左子树
    118. cout << bt->data; //访问根结点bt的数据域
    119. InOrder(bt->rchid); //中序递归遍历bt的右子树
    120. }
    121. }
    122. //后序遍历
    123. void BiTree::PostOrder(BiNode* bt) {
    124. if (bt == nullptr)
    125. return;
    126. else {
    127. PostOrder(bt->lchid); //后序递归遍历bt的左子树
    128. PostOrder(bt->rchid); //后序递归遍历bt的右子树
    129. cout << bt->data; //访问根结点bt的数据域
    130. }
    131. }
    132. //计算该二叉树的叶子结点个数
    133. int BiTree::LeafCount(BiNode* bt) {
    134. if (bt == nullptr)
    135. return 0;
    136. if (bt->lchid == nullptr && bt->rchid == nullptr) {
    137. return 1;
    138. }
    139. else
    140. {
    141. return LeafCount(bt->lchid) + LeafCount(bt->rchid);
    142. }
    143. }
    144. // //计算二叉树的深度
    145. int BiTree::Depth(BiNode *bt){
    146. if (bt == nullptr)
    147. return 0;
    148. else {
    149. int n, m;
    150. m = Depth(bt->lchid);
    151. n = Depth(bt->rchid);
    152. if (m > n)
    153. return m + 1;
    154. else
    155. return n + 1;
    156. }
    157. }
    158. int main() {
    159. //试验:输入A B # D # # C # #
    160. cout << "请依次输入二叉树序列:" << endl;
    161. BiTree T{};//定义对象变量 T
    162. std::cout << "该二叉树的前序遍历序列为:";
    163. T.PreOrder();
    164. std::cout << endl;
    165. std::cout << "叶子结点的个数为:";
    166. T.LeafCount();
    167. cout << endl;
    168. cout << "树的深度为:";
    169. T.Depth();
    170. cout << endl;
    171. system("pause");
    172. return 0;
    173. }

    运行结果:

    补充计算二叉树结点个数方法:(R+L+D=结点个数)

    1. /*
    2. * 二叉树的使用
    3. */
    4. #include
    5. #include
    6. using namespace std;
    7. /*
    8. * 二叉树的结点结构
    9. */
    10. struct BiNode {
    11. char data;
    12. BiNode* lchid, * rchid;
    13. };
    14. /*
    15. * 二叉链表的实现
    16. */
    17. class BiTree {
    18. private:
    19. BiNode* Creat(); //建树
    20. void Release(BiNode* bt); //销毁
    21. void PreOrder(BiNode* bt); //前序
    22. void InOrder(BiNode* bt); //中序
    23. void PostOrder(BiNode* bt); //后序
    24. int NodeCount(BiNode* bt); //计算二叉树结点个数
    25. int Depth(BiNode* bt); //计算二叉树深度
    26. int LeafCount(BiNode* bt); //计算二叉树叶子结点个数
    27. BiNode* root; //指向根结点的头指针
    28. public:
    29. BiTree() {
    30. root = Creat();
    31. }
    32. ~BiTree() {
    33. Release(root);
    34. }
    35. //前序遍历二叉树
    36. void PreOrder() {
    37. PreOrder(root);
    38. }
    39. //中序遍历二叉树
    40. void InOrder() {
    41. InOrder(root);
    42. }
    43. //后序遍历二叉树
    44. void PostOrder() {
    45. PostOrder(root);
    46. }
    47. //层序二叉树
    48. void LevelOrder();
    49. //计算二叉树结点个数
    50. void NodeCount() {
    51. cout << NodeCount(root);
    52. }
    53. //计算树的深度
    54. void Depth() {
    55. cout << Depth(root);
    56. }
    57. //计算二叉树叶子结点个数
    58. void LeafCount() {
    59. cout<<LeafCount(root);
    60. }
    61. };
    62. //建立二叉树
    63. BiNode* BiTree::Creat()
    64. {
    65. BiNode* bt;
    66. //cout << "请依次输入二叉树序列:" << endl;
    67. char ch;
    68. cin >> ch; //输入结点的数据信息,假设为字符
    69. if (ch == '#') //建立一个空树
    70. bt = nullptr;
    71. else {
    72. bt = new BiNode;//开辟空间
    73. bt->data = ch; //树根
    74. bt->lchid = Creat();//递归建立左子树
    75. bt->rchid = Creat();//递归建立右子树
    76. }
    77. return bt;
    78. }
    79. //销毁二叉树(后序消除法)
    80. void BiTree::Release(BiNode* bt) {
    81. if (bt == nullptr)
    82. return;
    83. else {
    84. Release(bt->lchid); //释放左子树
    85. Release(bt->rchid); //释放右子树
    86. delete bt; //释放根结点
    87. }
    88. }
    89. //层序遍历二叉树
    90. void BiTree::LevelOrder() {
    91. BiNode* Q[100], * q = nullptr;
    92. int font = -1, rear = -1;//队列初始化
    93. if (root == nullptr)
    94. return;
    95. Q[++rear] = root;//根指针入队
    96. while (font != rear)
    97. {
    98. q = Q[++font];//出队
    99. cout << q->data << "\t";
    100. if (q->lchid != nullptr)
    101. Q[++rear] = q->lchid;
    102. if (q->rchid != nullptr)
    103. Q[++rear] = q->rchid;
    104. }
    105. }
    106. //前序遍历
    107. void BiTree::PreOrder(BiNode* bt) {
    108. if (bt == nullptr)
    109. return;
    110. else {
    111. std::cout << bt->data; //访问根结点bt的数据域
    112. PreOrder(bt->lchid); //前序递归遍历bt的左子树
    113. PreOrder(bt->rchid); //前序递归遍历bt的右子树
    114. }
    115. }
    116. //中序遍历
    117. void BiTree::InOrder(BiNode* bt) {
    118. if (bt == nullptr)
    119. return;
    120. else
    121. {
    122. InOrder(bt->lchid); //中序递归遍历bt的左子树
    123. cout << bt->data; //访问根结点bt的数据域
    124. InOrder(bt->rchid); //中序递归遍历bt的右子树
    125. }
    126. }
    127. //后序遍历
    128. void BiTree::PostOrder(BiNode* bt) {
    129. if (bt == nullptr)
    130. return;
    131. else {
    132. PostOrder(bt->lchid); //后序递归遍历bt的左子树
    133. PostOrder(bt->rchid); //后序递归遍历bt的右子树
    134. cout << bt->data; //访问根结点bt的数据域
    135. }
    136. }
    137. //计算二叉树结点个数
    138. int BiTree::NodeCount(BiNode* bt) {
    139. if (bt == nullptr)
    140. return 0;
    141. else {
    142. return NodeCount(bt->lchid) + NodeCount(bt->rchid)+1;
    143. }
    144. }
    145. //计算该二叉树的叶子结点个数
    146. int BiTree::LeafCount(BiNode* bt) {
    147. if (bt == nullptr)
    148. return 0;
    149. if (bt->lchid == nullptr && bt->rchid == nullptr) {
    150. return 1;
    151. }
    152. else
    153. {
    154. return LeafCount(bt->lchid) + LeafCount(bt->rchid);
    155. }
    156. }
    157. // //计算二叉树的深度
    158. int BiTree::Depth(BiNode *bt){
    159. if (bt == nullptr)
    160. return 0;
    161. else {
    162. int n, m;
    163. m = Depth(bt->lchid);
    164. n = Depth(bt->rchid);
    165. if (m > n)
    166. return m + 1;
    167. else
    168. return n + 1;
    169. }
    170. }
    171. int main() {
    172. //试验:输入A B # D # # C # #
    173. cout << "请依次输入二叉树序列:" << endl;
    174. BiTree T{};//定义对象变量 T
    175. std::cout << "该二叉树的前序遍历序列为:";
    176. T.PreOrder();
    177. std::cout << endl;
    178. //二叉树结点个数
    179. cout << "二叉树结点个数为:";
    180. T.NodeCount();
    181. cout << endl;
    182. //叶子结点的个数
    183. std::cout << "叶子结点的个数为:";
    184. T.LeafCount();
    185. cout << endl;
    186. //树的深度
    187. cout << "树的深度为:";
    188. T.Depth();
    189. cout << endl;
    190. system("pause");
    191. return 0;
    192. }

    运行结果:

    二叉树相关方法大实现: 

    • 计算二叉树深度方法
    • 计算二叉树结点个数方法:(R+L+D=结点个数)
    • 计算叶子结点的个数方法

    1. /*
    2. * 二叉树的使用
    3. */
    4. #include
    5. #include
    6. using namespace std;
    7. /*
    8. * 二叉树的结点结构
    9. */
    10. struct BiNode {
    11. char data;
    12. BiNode* lchid, * rchid;
    13. };
    14. /*
    15. * 二叉链表的实现
    16. */
    17. class BiTree {
    18. private:
    19. BiNode* Creat(); //建树
    20. void Release(BiNode* bt); //销毁
    21. void PreOrder(BiNode* bt); //前序
    22. void InOrder(BiNode* bt); //中序
    23. void PostOrder(BiNode* bt); //后序
    24. int NodeCount(BiNode* bt); //计算二叉树结点个数
    25. int Depth(BiNode* bt); //计算二叉树深度
    26. int LeafCount(BiNode* bt); //计算二叉树叶子结点个数
    27. BiNode* root; //指向根结点的头指针
    28. public:
    29. BiTree() {
    30. root = Creat();
    31. }
    32. ~BiTree() {
    33. Release(root);
    34. }
    35. //前序遍历二叉树
    36. void PreOrder() {
    37. PreOrder(root);
    38. }
    39. //中序遍历二叉树
    40. void InOrder() {
    41. InOrder(root);
    42. }
    43. //后序遍历二叉树
    44. void PostOrder() {
    45. PostOrder(root);
    46. }
    47. //层序二叉树
    48. void LevelOrder();
    49. //计算二叉树结点个数
    50. void NodeCount() {
    51. cout << NodeCount(root);
    52. }
    53. //计算树的深度
    54. void Depth() {
    55. cout << Depth(root);
    56. }
    57. //计算二叉树叶子结点个数
    58. void LeafCount() {
    59. cout<<LeafCount(root);
    60. }
    61. };
    62. //建立二叉树
    63. BiNode* BiTree::Creat()
    64. {
    65. BiNode* bt;
    66. //cout << "请依次输入二叉树序列:" << endl;
    67. char ch;
    68. cin >> ch; //输入结点的数据信息,假设为字符
    69. if (ch == '#') //建立一个空树
    70. bt = nullptr;
    71. else {
    72. bt = new BiNode;//开辟空间
    73. bt->data = ch; //树根
    74. bt->lchid = Creat();//递归建立左子树
    75. bt->rchid = Creat();//递归建立右子树
    76. }
    77. return bt;
    78. }
    79. //销毁二叉树(后序消除法)
    80. void BiTree::Release(BiNode* bt) {
    81. if (bt == nullptr)
    82. return;
    83. else {
    84. Release(bt->lchid); //释放左子树
    85. Release(bt->rchid); //释放右子树
    86. delete bt; //释放根结点
    87. }
    88. }
    89. //层序遍历二叉树
    90. void BiTree::LevelOrder() {
    91. BiNode* Q[100], * q = nullptr;
    92. int font = -1, rear = -1;//队列初始化
    93. if (root == nullptr)
    94. return;
    95. Q[++rear] = root;//根指针入队
    96. while (font != rear)
    97. {
    98. q = Q[++font];//出队
    99. cout << q->data << "\t";
    100. if (q->lchid != nullptr)
    101. Q[++rear] = q->lchid;
    102. if (q->rchid != nullptr)
    103. Q[++rear] = q->rchid;
    104. }
    105. }
    106. //前序遍历
    107. void BiTree::PreOrder(BiNode* bt) {
    108. if (bt == nullptr)
    109. return;
    110. else {
    111. std::cout << bt->data; //访问根结点bt的数据域
    112. PreOrder(bt->lchid); //前序递归遍历bt的左子树
    113. PreOrder(bt->rchid); //前序递归遍历bt的右子树
    114. }
    115. }
    116. //中序遍历
    117. void BiTree::InOrder(BiNode* bt) {
    118. if (bt == nullptr)
    119. return;
    120. else
    121. {
    122. InOrder(bt->lchid); //中序递归遍历bt的左子树
    123. cout << bt->data; //访问根结点bt的数据域
    124. InOrder(bt->rchid); //中序递归遍历bt的右子树
    125. }
    126. }
    127. //后序遍历
    128. void BiTree::PostOrder(BiNode* bt) {
    129. if (bt == nullptr)
    130. return;
    131. else {
    132. PostOrder(bt->lchid); //后序递归遍历bt的左子树
    133. PostOrder(bt->rchid); //后序递归遍历bt的右子树
    134. cout << bt->data; //访问根结点bt的数据域
    135. }
    136. }
    137. //计算二叉树结点个数
    138. int BiTree::NodeCount(BiNode* bt) {
    139. if (bt == nullptr)
    140. return 0;
    141. else {
    142. return NodeCount(bt->lchid) + NodeCount(bt->rchid)+1;
    143. }
    144. }
    145. //计算该二叉树的叶子结点个数
    146. int BiTree::LeafCount(BiNode* bt) {
    147. if (bt == nullptr)
    148. return 0;
    149. if (bt->lchid == nullptr && bt->rchid == nullptr) {
    150. return 1;
    151. }
    152. else
    153. {
    154. return LeafCount(bt->lchid) + LeafCount(bt->rchid);
    155. }
    156. }
    157. // //计算二叉树的深度
    158. int BiTree::Depth(BiNode *bt){
    159. if (bt == nullptr)
    160. return 0;
    161. else {
    162. int n, m;
    163. m = Depth(bt->lchid);
    164. n = Depth(bt->rchid);
    165. if (m > n)
    166. return m + 1;
    167. else
    168. return n + 1;
    169. }
    170. }
    171. int main() {
    172. //试验:输入A B # D # # C # #
    173. cout << "请依次输入二叉树序列:" << endl;
    174. BiTree T{};//定义对象变量 T
    175. std::cout << "该二叉树的前序遍历序列为:";
    176. T.PreOrder();
    177. std::cout << endl;
    178. //二叉树结点个数
    179. cout << "二叉树结点个数为:";
    180. T.NodeCount();
    181. cout << endl;
    182. //叶子结点的个数
    183. std::cout << "叶子结点的个数为:";
    184. T.LeafCount();
    185. cout << endl;
    186. //树的深度
    187. cout << "树的深度为:";
    188. T.Depth();
    189. cout << endl;
    190. system("pause");
    191. return 0;
    192. }

    运行结果:

     

  • 相关阅读:
    yolov7 onnx tensorrt 批量预测 全网首发
    在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透
    YOLOv8-Pose推理详解及部署实现
    【nlp-with-transformers】|Transformers中的generate函数解析
    nodejs操作rabbitMQ amqplib库 消息持久化
    Word2Vec词向量训练、使用及可视化操作
    LeetCode 33.搜索旋转排序数组
    利用Proxifier配置多级代理
    Linux 主机数据拷贝与 Linux 服务器之间拷贝文件的方法
    原生js--购物车案例
  • 原文地址:https://blog.csdn.net/m0_63064861/article/details/127556214