文件读取二叉树

以前采用先序遍历的方式创建二叉树,每次测试的时候都需要重新输入树的结点。

命令行输入树

/**
 * 先序建立二叉树 TLR
 * @param T 引用 main 函数中定义的树根节点的地址
 */
void createBintree(Bintree &T) {
    char data;
    cin >> data;
    getchar(); // 接收 space 或 enter

    if (data == '#') { // # 结束符
        T = nullptr;
    } else {
        T = (Bintree) malloc(sizeof(Bnode)); // 新建节点
        T->data = data;
        cout << data << " 左节点(#结束): ";
        createBintree(T->Lchild);
        cout << data << " 右节点(#结束): ";
        createBintree(T->Rchild);
    }
}

比如创建上图这棵树,运行时,需要输入:

输入树的根结点: 1
1 左结点(#结束): 2
2 左结点(#结束): #
2 右结点(#结束): #
1 右结点(#结束): 3
3 左结点(#结束): 4
4 左结点(#结束): #
4 右结点(#结束): #
3 右结点(#结束): 5
5 左结点(#结束): #
5 右结点(#结束): #

每次都这样,一开始有这么多输入,就很影响效率,之后我在先序创建树的基础上,将 cin >> data 替换为 readTree >> data 从文件中读取结点,就不用每次输入了。

文件读取树

ifstream readTree; // 定义全局的输入文件流

/**
 * 仿照 createBintree 递归读取文件结点 先序创建树
 */
void readData(Bintree &T) {
    char data;
    readTree >> data;
    if (data == '#') { // # 结束符
        T = nullptr;
    } else {
        T = (Bintree) malloc(sizeof(Bnode)); // 新建节点
        T->data = data;
        readData(T->Lchild);
        readData(T->Rchild);
    }
}

/**
 * 从文件读取树的结点
 * @param filename 文件名
 * @param T 树根
 */
void createTreeFromFile(const string &filename, Bintree &T) {
    readTree.open(filename); // 打开文件流
    if (!readTree.is_open()) {
        cout << "Open Error";
        exit(0);
    }
    readData(T); // 读取文件建树
    readTree.close(); // 关闭文件流
}

测试

tree.txt

1 2 # # 3 4 # # 5 # #
int main() {
    // 从文件读取创建树
    Bintree bintree;
    createTreeFromFile("../tree.txt", bintree); // 相对路径

    // 三序遍历和层序
    cout << "先序遍历: ";
    preOrder(bintree);
    cout << endl;
    cout << "中序遍历: ";
    inOrder(bintree);
    cout << endl;
    cout << "后序遍历: ";
    postOrder(bintree);
    cout << endl;
    cout << "层序遍历: ";
    levelOrder(bintree);
    cout << endl;

    // 树高
    cout << "树的高度: " << depthBintree(bintree) << endl << endl;
    return 0;
}
先序遍历: 1 2 3 4 5 
中序遍历: 2 1 4 3 5 
后序遍历: 2 4 5 3 1 
层序遍历: 1 2 3 4 5 
树的高度: 3

遍历用到的函数:二叉树三序遍历 + 层序遍历(循环队列)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,632评论 0 25
  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 1,711评论 0 7
  • //转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/d...
    大海一滴写字的地方阅读 765评论 0 2
  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,675评论 0 14
  • 我爱春雨,爱它的温柔,爱它的无私,它是我心中的风景。 绵绵春雨,“随风潜入夜,润物细无声”。一滴滴春雨,润绿了小草...
    千山万水_88cf阅读 190评论 0 0

友情链接更多精彩内容