二叉树
发布日期:2021-05-07 18:28:49 浏览次数:22 分类:精选文章

本文共 3383 字,大约阅读时间需要 11 分钟。

以下是优化后的内容:


二叉树操作与分析

输入方式

输入方式采用先序遍历(即先输入根结点,依次输入左结点和右结点,若无左结点或右结点则输入#表示缺失).

输出要求

系统将输出以下内容:

  • 中序遍历结果
  • 先序遍历结果
  • 后序遍历结果
  • 树的深度
  • 树中结点总数
  • 叶结点数
  • 度为1的结点数
  • 从每个叶子结点到根结点的路径

  • 代码实现

    #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秒