zoukankan      html  css  js  c++  java
  • 剑指Offer-- 重建二叉树

    思路还是很明了的,不知道为啥就是过不去了。这是之前写的版本,有问题,后来 又写了一个版本

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
            
            int rootval = pre[0];
            TreeNode* root = new TreeNode(rootval);
            return helper(root, pre, vin);
        }
        TreeNode* helper (TreeNode *preroot,vector<int> pre,vector<int> vin)
        {
            int lenL = 0,lenR = 0,i = 0,len;
            len = pre.size();        //总的长度
            
            while (vin[i++] != preroot -> val)
            {
                lenL++;              // 左子树的长度
            }
            lenR = len - lenL - 1;   // 右子树的长度
            if (len == 0|| lenL == 0 || lenR == 0)
                return nullptr;
            vector<int> preleftTree,prerightTree;   // 定义前序左子树,前序右子树
            vector<int> inleftTree,inrightTree;     // 定义中序左子树,中序右子树
            for (int m = 0,n = 0; m < lenL; m++)
            {
                preleftTree[n++] = pre[1 + m];      //构建前序左子树
            }
            for (int m = 0,n = 0; m < lenL; m++)
            {
                inleftTree[n++] = vin[m];       // 构建中序左子树
            }
            
            for (int m = 0,n = 0; m < lenR; m++)
            {
                prerightTree[n++] = pre[1 + m + lenL];// 构建前序右子树
            }
            for (int m = 0,n = 0; m < lenR; m++)
            {
                inrightTree[n++] = vin[1 + m + lenL];   // 构建中序右子树
            }
            TreeNode * leftC = new TreeNode(preleftTree[0]);
            preroot -> left = leftC;
            TreeNode * rightC = new TreeNode(prerightTree[0]);
            preroot -> right = rightC;
            helper(leftC,preleftTree,inleftTree);
            helper(rightC,prerightTree,inrightTree);
            return preroot;
        }
    };

    新版本如下:可以调试过去,思路还是递归去找 左子树 和 右子树。

    #include <iostream>
    #include <vector>
    using namespace std;
    
    struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
      };
    
        TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
            if (pre.size()<= 0 || vin.size() <=0)                  // pre和vin的大小应该是一样的
                return nullptr;
            int lenR = 0, lenL = 0, len, i = 0;
            len = pre.size();
            TreeNode* root = new TreeNode(pre[0]);
    
            while(vin[i] != root -> val)
            {
                i++;
                lenL++;
            }
            lenR = len - lenL - 1;
    
            vector<int> preLeftTree,preRightTree,inLeftTree,inRightTree;
            for (int j = 1; j <= lenL; j++)
            {
                preLeftTree.push_back(pre[j]);          // 构建左子树的前序排列
            }
            for (int j = 1 + lenL; j <= len - 1; j++)
            {
                preRightTree.push_back(pre[j]);        //  构建右子数的前序排列
            }
    
            for (int j = 0; j < lenL; j++)
            {
                inLeftTree.push_back(vin[j]);          // 构建左子树的中序排列
            }
            for (int j = 1 + lenL; j <= len - 1; j++)
            {
                inRightTree.push_back(vin[j]);        //  构建右子数的中序排列
            }
    
            root -> left = reConstructBinaryTree(preLeftTree, inLeftTree);
            root -> right = reConstructBinaryTree(preRightTree, inRightTree);
            return root;
    
        }
    //递归前序遍历二叉树
    void preOrderTraversal(TreeNode* root)
    {
        if (root != nullptr)
        {
            cout << root -> val << endl;
            preOrderTraversal(root -> left);
            preOrderTraversal(root -> right);
        }
    }
    int main()
    {
        vector<int> pre{1,2,4,7,3,5,6,8},vin{4,7,2,1,5,3,8,6};
        TreeNode* p = reConstructBinaryTree(pre, vin);
        preOrderTraversal(p);
        return 0;
    }

    结果如下:

    看了一个别人的

    /** 
     * Definition for binary tree 
     * struct TreeNode { 
     *     int val; 
     *     TreeNode *left; 
     *     TreeNode *right; 
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 
     * }; 
     */  
    class Solution  
    {  
        public:  
            struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)  
            {  
                int lenp = pre.size();  
                int leni = in.size();  
                if(lenp==0 || leni==0 || lenp!=leni)  
                    return nullptr;
      
                TreeNode *root = new TreeNode(pre[0]);  
                int mid = find(in.begin(),in.end(),pre[0])-in.begin();  
      
                vector<int> left_pre(pre.begin()+1,pre.begin()+1+mid);  
                vector<int> left_in(in.begin(),in.begin()+mid);  
                vector<int> right_pre(pre.begin()+1+mid,pre.end());  
                vector<int> right_in(in.begin()+mid+1,in.end());  
      
                root->left = reConstructBinaryTree(left_pre,left_in);  
                root->right = reConstructBinaryTree(right_pre,right_in);  
      
                return root;  
            }  
    };  
  • 相关阅读:
    为什么这年头蓝牙功能越来越差
    猜数字-暴力枚举
    怎么使用PHPMailer实现邮件的发送??
    实现windows操作系统和VB下Linux虚拟操作系统相互传取文件方式总结
    第一篇 对Javascript中原型的深入理解
    每天进步一点点——关于SSD写入放大问题
    两步改动CentOS主机名称
    [CentOs7]搭建ftp服务器
    Another app is currently holding the yum lock
    [CentOs7]安装mysql(2)
  • 原文地址:https://www.cnblogs.com/simplepaul/p/6792353.html
Copyright © 2011-2022 走看看