LeetCode 106 Construct Binary Tree from Inorder and Postorder Traversal

本文介绍了一种通过中序和后序遍历构建二叉搜索树的方法,并提供了一个使用深度优先搜索(DFS)实现的具体示例代码。该方法通过递归地查找树根节点在中序遍历中的位置来划分左右子树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个是一道深度优先搜索的题目。

我们如何处理中序遍历和后序遍历的数组,使其能够表示成一颗二叉搜索树呢?

我是这样处理的。

首先,我们知道后序遍历的数组。从后到前是树根-子树根-子子树根,好了,有了这个递归的顺序我们就可以执行了。

首先取出树根节点,在中序遍历的数组中寻找这个节点所在的位置,那么这个位置的左侧就是左子树,右侧是右子树。

根据这个道理再递归求解就可以了。唯一需要注意的是开始和结束。我之前每一个栈就开一个vector存下当前子树集,结果就超内存了,于是就每次指定位置了。

和这个题很像的兄弟题目是,你只需要把后序遍历数组从后往前开始,变成从前往后遍历。

105 Construct Binary Tree from Preorder and Inorder Traversal

代码如下:

class Solution {
public:
     TreeNode* DFS(vector<int>& inorder, vector<int>& postorder,int s_p,int e_p,int s_i,int e_i)
     {   //cout<<s_i<<" "<<e_i<<endl;
         //cout<<s_p<<" "<<e_p<<endl;
          if(s_i==e_i||s_p==e_p)return NULL;
          TreeNode* head = new TreeNode(-1);
          if(e_i-s_i==1)
          {
              TreeNode* tmp = new TreeNode(-1);
              //cout<<s_i<<endl;
              tmp->val = inorder[s_i];
              return tmp;
          }
          else
          {   int index;
              for(int i=s_i;i<e_i;i++)
               if(inorder[i]==postorder[e_p-1]){index = i;break;}
             int len = index-s_i;
             head->val = postorder[e_p-1]; 
             head->right = DFS(inorder,postorder,e_p-(e_i-len)+s_i,e_p-1,index+1,e_i);
            // cout<<"hahah"<<endl;
             head->left = DFS(inorder,postorder,s_p,len+s_p,s_i,s_i+len);
          }
         return head;
     }

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
              if(inorder.empty())return NULL;
               return DFS(inorder,postorder,0,postorder.size(),0,inorder.size());
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值