如何根据两个顺序构造⼀个唯⼀的⼆叉树?

本题思路根据Carl大佬整理,大家感兴趣的去关注一波。如果你想提升算法能力,只要跟住代码随想录每天题目的节奏,定会融会贯通,算法能力稳稳的提升一个台阶!

一、⾸先如何根据两个顺序构造⼀个唯⼀的⼆叉树?

1、以中序和后序遍历来说:

就是以 后序数组的最后⼀个元素为切割点,先切中序数组,然后根据中序左数组,反过来在切后序数组。⼀层⼀层切下去,每次后序数组最后⼀个元素就是节点元素。

1、接下来想到用递归法
(1)、如果后序数组大小为0,说明是空节点。返回NULL。
(2)、如果不为空,取后序数组最后一个元素作为节点元素。同时再判断一下后序数组大小是不是为1,为1说明是叶子节点直接返回。
(3)、接着找到后序数组最后一个元素在中序数组的位置,作为切割点。
(4)、把中序数组切割成中序左数组和中序右数组。
(5)、把后序数组切割成后序左数组和后序右数组。
(6)、递归处理左区间和右区间。

注意事项:
1、确定切割标准,找好边界值。
2、先切中序数组,因为切割点是后序数组最后一个元素。
3、后序数组没有明确的切割点,但是要记得中序数组大小一定等于后序数组大小
现在我们把中序数组切成了中序左数组和中序右数组,那么后序数组就可以按照中序左数组的大小来切割,得到后序左数组和后序右数组。

递归法(容器分割)

class Solution{
   
private:
    TreeNode* traversal(vector<int>&inorder,vector<int>&postorder) {
   
    //第一步,判断后序数组大小是否为0
    if(postorder.size()==0) return NULL;
    
    //第二步,找到后序遍历数组最后⼀个元素,就是当前的中间节点,接着判断是不是叶子节点
    int rootValue=postorder[postorder.size()-1];
    TreeNode* root=newTreeNode(rootValue);
    if(postorder.size()==1) return root;
    
    //第三步,找到中序遍历的切割点
    int delimiterIndex;//1从0开始,因为是容器里面装着数组
    for(delimiterIndex=0;delimiterIndex<inorder.size();delimiterIndex++) {
   
    if(inorder[delimiterIndex]==rootValue)break;
    }
  
    //第四步,切割中序数组
    //左闭右开区间:[0, delimiterIndex)
    vector<int> leftInorder(inorder.begin(),inorder.begin()+delimiterIndex);
    // [delimiterIndex + 1, end)
    vector<int> rightInorder(inorder.begin()+delimiterIndex+1,inorder
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值