实验题目:
1、以二叉链表作为二叉树的存储结构,中序建立一课二叉树。
2、统计二叉树的叶子结点个数。
3、按层次遍历二叉树的方法,统计二叉树中度为1的节点个数。
实验要求:
1、尝试利用多文件编译实现。
2、熟悉并掌握相关的编码规范。
3、遵从“Honor Code”原则,独立完成相关项目。
cpp
#ifndef TREE_NODE_H
#define TREE_NODE_H
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Tree {
public:
TreeNode* root;
Tree(TreeNode* r) : root(r) {}
};
#endif //TREE_NODE_H
cpp
#ifndef BUILD_TREE_H
#define BUILD_TREE_H
#include "TreeNode.h"
TreeNode* buildTree() {
// 中序遍历建立二叉树,此处省略具体实现,返回根节点指针
}
#endif //BUILD_TREE_H
cpp
#ifndef TREE_OPERATION_H
#define TREE_OPERATION_H
#include "TreeNode.h"
#include <iostream>
using namespace std;
// 统计二叉树的叶子节点个数
int countLeaves(TreeNode* root) {
if (root == NULL) {
return 0;
} else if (root->left == NULL && root->right == NULL) {
return 1;
} else {
return countLeaves(root->left) + countLeaves(root->right);
}
}
// 统计二叉树中度为1的节点个数
int countDegreeOne(TreeNode* root) {
if (root == NULL) {
return 0;
} else {
int leftCount = countDegreeOne(root->left);
int rightCount = countDegreeOne(root->right);
if (leftCount == 1 || rightCount == 1) {
return 1;
} else {
return leftCount + rightCount;
}
}
}
// 按层次遍历二叉树,统计二叉树中度为1的节点个数(非递归)
void levelOrder(TreeNode* root, int level, int& count) {
if (root == NULL) {
return;
} else if (level == 1) { // 根节点所在的层次为1,判断当前节点的度数是否为1,是则计数器加1,继续遍历左右子树;否则只遍历左右子树。这里以遍历左子树为例。注意,遍历右子树时需要修改判断条件和递归顺序。这里先省略具体实现。如果需要可以自行完成。