zoukankan      html  css  js  c++  java
  • 剑指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;
    }
    

      

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

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

  • 相关阅读:
    Python格式化字符 %s %d %f
    FTP学习笔记
    万维网
    TCP笔记
    TCP流量控制
    笔记传输层
    传输层协议
    网络层
    以太网笔记
    计算机网络物理层
  • 原文地址:https://www.cnblogs.com/perfy576/p/8569256.html
Copyright © 2011-2022 走看看