通过二叉树的中序和后序遍历序列构造二叉树(非递归)

题目:通过二叉树的中序和后序遍历序列构造二叉树

同样,使用分治法来实现是完全可以的,可是在LeetCode中运行这种方法的代码,总是会报错:

Memory Limit Exceeded
 ,所以这里还是 用栈来实现二叉树的构建。

与用先序和后序遍历构造二叉树的方法类似,但还是要做一些改变:



如果从后往前处理中序和后序的序列,则处理就为如下所示的情况:

Reverse_Post: 根—右子树—左子树
Reverse_In: 右子树—根—左子树


这样处理方式和先序—中序就差不多了,只是将添加左孩子的情况,改为添加右孩子,反之依然。
实现代码如下所示:
TreeNode *buildTree_in_post(vector<int> &inorder, vector<int> &postorder)
{
    stack<TreeNode *> s;
    int len = (int) inorder.size();
    if(len == 0)
        return  NULL;
    int in_ptr, post_ptr;//分别用于对中序和后序处理
    in_ptr = post_ptr = len-1;//从序列最后一个元素往前进行处理
    TreeNode* root = new TreeNode(postorder[post_ptr]);//构造根结点,后序遍历最后一个元素为根结点的值
    TreeNode* pCur = root;//用于保存树当前处理结点
    int flag = 0;//用于决定是否构造左结点
    post_ptr--;
    s.push(root);

    while(post_ptr > -1)//处理到pOstorder[0]
    {
        if(!s.empty() && s.top()->val == inorder[in_ptr])
        {
           pCur = s.top();
           s.pop();
           in_ptr--;
           flag = 1;
        }
        else
        {
            if(flag == 1)//构造左结点
            {
                pCur->left = new TreeNode(postorder[post_ptr]);
                pCur = pCur->left;
                s.push(pCur);
                post_ptr--;
                flag = 0;
            }
            else//构造右结点
            {
                pCur->right = new TreeNode(postorder[post_ptr]);
                pCur = pCur->right;
                s.push(pCur);
                post_ptr--;
            }
        }
    }
    return root;
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值