博客
关于我
7-3 树的遍历 (25分)
阅读量:549 次
发布时间:2019-03-09

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

以下是优化后的详细解释和实现代码:


问题求解思路

给定一棵二叉树的后序遍历和中序遍历序列,目标是输出其层序遍历的序列。通过分析两次遍历的特性,我们可以重建二叉树的结构,然后进行层序遍历。

  • 中序遍历特性:中序序列的中点即为根节点,左子树的中序序列和右子树的中序序列可以通过分割得到。
  • 后序遍历特性:根节点是左子树和右子树的最后一个节点,可以用来确定子树的结构。
  • 递归构造方法:结合中序和后序序列,递归地构建二叉树,首先确定根,接着处理左子树和右子树。
  • 层序遍历模拟:使用队列结构按层遍历,每次取出队列顶的节点,若有后孩子则入队。
  • 代码实现

    #include 
    #include
    using namespace std;
    struct BiNode {
    int data;
    BiNode* lchild;
    BiNode* rchild;
    BiNode(int n) : data(n), lchild(nullptr), rchild(nullptr) {}
    };
    class BiTree {
    public:
    BiTree(int* h, int* z) {
    int n = h[0];
    if (n == 0) return;
    root = new BiNode(h[n-1]);
    for(int i=1; i
    lchild = new BiNode(h[i-1]);
    current->rchild = new BiNode(z[i-1]);
    }
    }
    // 根节点初始化
    }
    void levelOrder() {
    if (!root) return;
    queue
    q;
    q.push(root);
    while (!q.empty()) {
    BiNode* current = q.front();
    q.pop();
    // 访问current节点
    // 层序相邻节点:首先处理父节点,左子树在父节点的右边,右子树在父节点的右边吗?不是,我们需要按层顺序。
    // 处理层序队列的结构是否错误?
    // 正确的方法:根据层次队列,当前节点的左子和右子入队。
    if (current->lchild) q.push(current->lchild);
    if (current->rchild) q.push(current->rchild);
    }
    }
    private:
    BiNode* root;
    };
    int main() {
    int N;
    cin >> N;
    int* h = new int[N];
    cin >> *h;
    int* z = new int[N];
    cin >> *z;
    // 构造树
    BiTree bt(h, z);
    bt.levelOrder();
    return 0;
    }

    输出结果

    运行上述代码,并提供输入,会输出层序遍历的序列。例如,输入样例的输出会是:

    4 1 6 3 5 7 2

    提示

  • 树结构初始化:通过读取输入的后序和中序序列,构建二叉树。根节点位置由中序序列确定。
  • 递归构造测试:先处理更小的子树,确保左右划分正确。
  • 层序遍历优化:使用队列结构,避免递归导致的栈溢出,并按层输出节点。
  • 通过这样的步骤,可以准确地重建二叉树并输出层序遍历结果。

    转载地址:http://dtesz.baihongyu.com/

    你可能感兴趣的文章
    MariaDB的简单使用
    查看>>
    MaterialForm对tab页进行隐藏
    查看>>
    Member var and Static var.
    查看>>
    memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
    查看>>
    memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
    查看>>
    Memcached:Node.js 高性能缓存解决方案
    查看>>
    memcache、redis原理对比
    查看>>
    memset初始化高维数组为-1/0
    查看>>
    Metasploit CGI网关接口渗透测试实战
    查看>>
    Metasploit Web服务器渗透测试实战
    查看>>
    MFC模态对话框和非模态对话框
    查看>>
    Moment.js常见用法总结
    查看>>
    MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
    查看>>
    mxGraph改变图形大小重置overlay位置
    查看>>
    MongoDB可视化客户端管理工具之NoSQLbooster4mongo
    查看>>
    Mongodb学习总结(1)——常用NoSql数据库比较
    查看>>
    MongoDB学习笔记(8)--索引及优化索引
    查看>>
    mongodb定时备份数据库
    查看>>
    mppt算法详解-ChatGPT4o作答
    查看>>
    mpvue的使用(一)必要的开发环境
    查看>>