#include <iostream>
// 二叉树结构定义
typedef struct BintreeNode {
char data;
struct BintreeNode* Ltree;//左树根
struct BintreeNode* Rtree;//右树根
}* tree;
// 二叉树的建立
void Creattree(tree* t) {
//传入的是指向指针的指针
char ch;
std::cin >> ch;
if (ch != '#') {
// 创建新结点
*t = (tree)malloc(sizeof(BintreeNode));
(*t)->data = ch;
// 函数递归调用自身,传入左子树的地址 &(*t)->Ltree。
Creattree(&(*t)->Ltree);
// 函数再次递归调用自身,传入右子树的地址& (*t)->Rtree。
Creattree(&(*t)->Rtree);
}
else
*t = NULL;
}
// 先序遍历
void DLRTraverse(tree t) {
//传入一个指向二叉树根节点的指针
if (t) {
std::cout << t->data;
// 函数递归本身
DLRTraverse(t->Ltree);
DLRTraverse(t->Rtree);
}
}
// 中序遍历
void LDRTraverse(tree t) {
if (t) {
LDRTraverse(t->Ltree);
std::cout << t->data;
LDRTraverse(t->Rtree);
}
}
// 后序遍历
void LRDTraverse(tree t) {
if (t) {
LRDTraverse(t->Ltree);
LRDTraverse(t->Rtree);
std::cout << t->data;
}
}
// 叶子结点计算
int countLeaves(tree root) {
if (root == NULL) return 0;
if (root->Ltree == NULL && root->Rtree == NULL) return 1;//判断是否为叶子结点
return countLeaves(root->Ltree) + countLeaves(root->Rtree);//通过函数递归计算,每一次都递归,直到不满足if (root->Ltree == NULL && root->Rtree == NULL),
所以左边是左结点的总数,右边是右结点的总数
}
// 所有结点计算
int countNodes(tree root) {
if (root == NULL) return 0;//空结点
return 1 + countNodes(root->Ltree) + countNodes(root->Rtree);//相比与叶子结点的计算,每次还需加上头结点以及第一次的根节点
}
int main() {
tree root = NULL;
Creattree(&root);
// 输出三种排序
DLRTraverse(root);
std::cout << std::endl;
LDRTraverse(root);
std::cout << std::endl;
LRDTraverse(root);
std::cout << std::endl;
// 输出叶子结点数
int leaves = countLeaves(root);
std::cout << "叶子结点数: " << leaves << std::endl;
// 输出结点数
int nodes = countNodes(root);
std::cout << "总结点数: " << nodes << std::endl;
return 0;
}
二叉树的基本操作
最新推荐文章于 2025-03-17 18:34:25 发布