• 剑指offer-6.重建二叉树


    0 题目

    输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树。

    1 分析

    中序遍历的结果,优先打印根节点,然后左右节点。

    前序遍历的结果,优先打印左节点,然后根节点,右节点。

    因此,中序遍历中第一个元素,在前序遍历的结果中可以将这个数组一分为三:左子树,根节点,右子树

    因此左子树的个数可以求出来,假设为n,那么在前序遍历的结果中,第2~n个节点就是在左子树的,是左子树的前序遍历结果。 这一部分是原来问题的一个子问题。

    TreeNode *reConstructBinaryTree(vector<int> pre, vector<int> in)
    {
        // 当其中一个 长度为0的时候,表明没有节点了,因此其根节点的对应子树应为nullptr
        // 因此这里返回nullptr
        int inlen = in.size();
        if (inlen == 0)
        {
            return nullptr;
        }
    
        vector<int> left_pre, right_pre, left_in, right_in;
    
        TreeNode *head = new TreeNode(pre[0]);
    
        int gen = 0;
    
        for (int i = 0; i < inlen; i++)
        {
            if (in[i] == pre[0])
            {
                gen = i;
                break;
            }
        }
    
        // 构造左子树的前序遍历结果和中序遍历结果
        for (int i = 0; i < gen; i++)
        {
            left_in.push_back(in[i]);       /
            left_pre.push_back(pre[i + 1]); //前序第一个为根节点
        }
    
        // 构造右子树的前序遍历结果和中序遍历结果
        for (int i = gen + 1; i < inlen; i++)
        {
            right_in.push_back(in[i]);
            right_pre.push_back(pre[i]);
        }
    
        // 分别挂到根节点的左右子树上
        head->left = reConstructBinaryTree(left_pre, left_in);
        head->right = reConstructBinaryTree(right_pre, right_in);
    
        // 构造玩本节点的左右子树后,返回本节点,挂在到他的根节点上。
        return head;
    }
    

      

    上面是递归的解法,利用了原来的函数。

    如果不进行拷贝,传入起始的迭代器的话,那么需要一个额外的递归函数。

  • 相关阅读:
    Spring MVC与JAX-RS比较与分析
    JDK历史版本下载
    第六篇:为多态基类声明虚析构函数
    第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数
    第四篇:了解 C++ 默默编写并调用的函数
    第三篇:确保对象在被使用前的初始化
    poj 2125(最小割)
    hdu 4704(费马小定理)
    hdu 4705(树形DP)
    poj 3469(网络流模版)
  • 原文地址:https://www.cnblogs.com/perfy576/p/8569256.html
Copyright © 2020-2023  润新知