力扣刷题记录50.1-----106. 从中序与后序遍历序列构造二叉树


一、题目

在这里插入图片描述

二、代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution
{
    //递归核心
    //变量及大框架
    //具体而言:  1.参数及返回值   2.终止条件  3.处理逻辑
public:
    TreeNode* traversal(vector<int>& inorder, vector<int>& postorder)
    {

       
    //    //后序遍历的最后一个节点  就是分割点
    //    int root_value=postorder[postorder.size()-1];
    //    TreeNode* root=new TreeNode(root_value);

    //    if(inorder.size()==1) return root;      //叶子节点的处理

        int i,j;        
        int find_index;
        TreeNode* root;    
        vector<int> left_inorder;
        vector<int> left_postorder;       
        vector<int> right_inorder;
        vector<int> right_postorder;
        vector<int>::iterator it; 
 

        if(inorder.size()==0) return nullptr;    
        else
        {
          

          //取后序遍历的最后一个值 作为切割值
          root=new TreeNode(postorder[postorder.size()-1]);
         // resize(postorder.size()-1);  //截断尾部
          
          if(inorder.size()==1) return root;   //返回部分的核心 

          for(i=0;i<inorder.size();i++)
          {
               if(inorder[i]==root->val)
               {
                   find_index=i;
                   break;
               }
          }
          

          left_inorder.assign(inorder.begin(),inorder.begin()+find_index);  //中间的分割值是不需要的
          right_inorder.assign(inorder.begin()+find_index+1,inorder.end());

          left_postorder.assign(postorder.begin(),postorder.begin()+left_inorder.size());
          right_postorder.assign(postorder.begin()+left_inorder.size(),postorder.end()-1);
        }


        
        root->left=traversal(left_inorder,left_postorder);
        root->right=traversal(right_inorder,right_postorder);       


        return root;
         
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) 
    {
      
     //前序遍历: 根左右
     //中序遍历: 左根右
     //后序遍历: 左右根
     //核心:递归--切割    具体而言,将一个vector切割成左右序列 递归传入自己  vector中只有一个元素 此时将vector值取出  作为节点返回
     // 构建树的过程  1.创建节点  2.建立连接
      
      if(inorder.size()==0) return nullptr;
      return traversal(inorder,postorder);
    }
};

三、运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值