
二叉树
中序遍历结果 先序遍历结果 后序遍历结果 树的深度 树中结点总数 叶结点数 度为1的结点数 从每个叶子结点到根结点的路径
输入方式:通过先序遍历输入二叉树节点数据,根节点先输入,左结点和右结点依次后输入,用 遍历函数: 树分析函数: 路径追踪函数:
发布日期:2021-05-07 18:28:49
浏览次数:22
分类:精选文章
本文共 3383 字,大约阅读时间需要 11 分钟。
以下是优化后的内容:
二叉树操作与分析
输入方式
输入方式采用先序遍历(即先输入根结点,依次输入左结点和右结点,若无左结点或右结点则输入#
表示缺失).
输出要求
系统将输出以下内容:
代码实现
#include#include #include using namespace std;typedef struct BiTNode { char data; struct BiTNode* lchild, *rchild;} BiTNode, *BiTree;void CreateBiTree(BiTree &T) { char ch; cin >> ch; if (ch == '#') { T = NULL; } else { T = new BiTNode; T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); }}void PreOrderTraverse(BiTree T) { if (T) { cout << T->data; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); }}void InOrderTraverse(BiTree T) { if (T) { InOrderTraverse(T->lchild); cout << T->data; InOrderTraverse(T->rchild); }}void PostOrderTraverse(BiTree T) { if (T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); cout << T->data; }}int Depth(BiTree T) { if (!T) return 0; int leftDepth = Depth(T->lchild); int rightDepth = Depth(T->rchild); return 1 + (leftDepth > rightDepth ? leftDepth : rightDepth);}int NodeCount(BiTree T) { if (!T) return 0; return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;}int LeafCount(BiTree T) { if (!T) return 0; if (T->lchild == NULL && T->rchild == NULL) return 1; return LeafCount(T->lchild) + LeafCount(T->rchild);}int NodeNumber_1(BiTree T) { if (!T) return 0; if ((T->lchild == NULL && T->rchild != NULL) || (T->lchild != NULL && T->rchild == NULL)) { return 1 + NodeNumber_1(T->lchild) + NodeNumber_1(T->rchild); } else { return NodeNumber_1(T->lchild) + NodeNumber_1(T->rchild); }}void Route(BiTree T, vector & path, int& pathlen) { if (!T) return; if (T->lchild == NULL && T->rchild == NULL) { path.push_back(T->data); for (int i = pathlen - 1; i >= 0; --i) { cout << path[i] << " "; } cout << endl; return; } path.push_back(T->data); Route(T->lchild, path, pathlen); Route(T->rchild, path, pathlen);}int main() { BiTree T; cout << "请先序遍历输入(以#结束): "; CreateBiTree(T); cout << "中序遍历输出:" << endl; InOrderTraverse(T); cout << "先序遍历输出:" << endl; PreOrderTraverse(T); cout << "后序遍历输出:" << endl; PostOrderTraverse(T); cout << "树的深度:" << Depth(T) << endl; cout << "结点总数:" << NodeCount(T) << endl; cout << "叶结点数:" << LeafCount(T) << endl; cout << "度为1的结点数:" << NodeNumber_1(T) << endl; vector path; int pathlen = 0; Route(T, path, pathlen); if (pathlen > 0) { cout << "从每个叶子结点到根结点的路径如下:" << endl; for (int i = 0; i < pathlen; ++i) { cout << path[i] << " "; } cout << endl; }}
代码解释
#
表示无子节点。PreOrderTraverse
:先序遍历,按根、左、右顺序输出节点。InOrderTraverse
:中序遍历,按左、根、右顺序输出节点。PostOrderTraverse
:后序遍历,按左、右、根顺序输出节点。
Depth
:计算树的深度。NodeCount
:统计结点总数。LeafCount
:统计叶结点数。NodeNumber_1
:统计度为1的结点数(叶结点或只有一个子节点的非叶结点)。
Route
,用于记录从根到每个叶子的路径。运行示例
输入如下,按先序遍历方式输入:
A## B#
输出:
中序遍历输出: B A先序遍历输出: A B后序遍历输出: B A树的深度: 2结点总数: 3叶结点数: 1度为1的结点数: 1从每个叶子结点到根结点的路径如下: A B
代码特点
- 高效性:所有遍历和统计函数都采用递归实现,适合处理二叉树结构。
- 清晰性:代码注释简洁,结构易于理解。
- 扩展性:函数模块化,便于后续功能扩展。
通过以上代码和分析,可以对二叉树的结构、遍历方式以及相关统计信息有全面了解。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月23日 17时21分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上周热点回顾(4.24-4.30)
2019-03-06
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2019-03-06
上周热点回顾(6.19-6.25)
2019-03-06
云计算之路-阿里云上:docker swarm 集群故障与异常
2019-03-06
上周热点回顾(2.19-2.25)
2019-03-06
云计算之路-阿里云上:博客web服务器轮番CPU 100%
2019-03-06
云计算之路-阿里云上:服务器CPU 100%问题是memcached连接数限制引起的
2019-03-06
上周热点回顾(3.26-4.1)
2019-03-06
上周热点回顾(6.25-7.1)
2019-03-06
【故障公告】10:30-10:45 左右 docker swarm 集群节点问题引发故障
2019-03-06
工作半年的思考
2019-03-06
不可思议的纯 CSS 滚动进度条效果
2019-03-06
【CSS进阶】伪元素的妙用--单标签之美
2019-03-06
惊闻NBC在奥运后放弃使用Silverlight
2019-03-06
IE下尚未实现错误的原因
2019-03-06
创建自己的Docker基础镜像
2019-03-06
Python 简明教程 --- 20,Python 类中的属性与方法
2019-03-06
KNN 算法-理论篇-如何给电影进行分类
2019-03-06
Spring Cloud第九篇 | 分布式服务跟踪Sleuth
2019-03-06