由前序 中序序列 求后序序列

本文介绍了一种使用前序和中序遍历构建二叉树的算法,并提供了具体的C++实现代码。该算法通过递归方式处理前序和中序数组,逐步构建出完整的二叉树结构。
#include <iostream>
#include "fun.cpp"
using namespace std;
int pre[]={1,2,3};int in[]={2,1,3};
void foo1(int preIndexBegin,int preIndexEnd,int inIndexBegin,int inIndexEnd)
{
if(inIndexEnd<inIndexBegin) return ;

  if(inIndexEnd ==inIndexBegin)
 {

  cout<<in[inIndexBegin];
  return ;
 }
  else
  {
    int k;
      for(int i=inIndexBegin;i<=inIndexEnd;i++)
        if(in[i]==pre[preIndexBegin])
            k=i;
            int count;
       count=k-inIndexBegin;
     foo1(preIndexBegin+1,preIndexBegin+count,inIndexBegin,k-1);
     foo1(preIndexBegin+count+1,preIndexEnd,k+1,inIndexEnd);
     cout<< pre[preIndexBegin];


  }


}
node * foo(int preIndexBegin,int preIndexEnd,int inIndexBegin,int inIndexEnd)
 {
/*

递归思想:


inorder 数组用来确定 pre 数组的分段。主力还是pre 数组。根据inorder 数组情况将pre 分成左右子数组。
边界条件 是inorder 数组里只剩一个数了。此数为叶节点。


*/



 if(inIndexEnd ==inIndexBegin)
 {




   node *p=(node *)malloc(sizeof(node));
   p->data=in[inIndexBegin];
   p->left=NULL;
   p->right=NULL;
   return p;
 }
  else
  {
      node *p=(node *)malloc(sizeof(node));
      p->data=pre[preIndexBegin];
      int k;
      for(int i=inIndexBegin;i<inIndexEnd;i++)
        if(in[i]==pre[preIndexBegin])
            k=i;
            int count;
       count=k-inIndexBegin;
      p->left=foo(preIndexBegin+1,preIndexBegin+count,inIndexBegin,k-1);
      p->right=foo(preIndexBegin+count+1,preIndexEnd,k+1,inIndexEnd);
         return p;
  }
 }





根据前序遍历和中遍历遍历的过程可以通过递归实现。基本思想是通过前序遍历找到根节点,然后在中遍历中确定左右子树的范围,递归构建左右子树,并最终完成后遍历。 ### 实现思路 1. **前序遍历的第一个元素**为当前子树的根节点。 2. 在**中遍历中找到根节点的位置**,左边部分是左子树的中遍历结果,右边部分是右子树的中遍历结果。 3. 根据左子树和右子树的节点数量,从**前序遍历中分割出左子树和右子树的前序遍历结果**。 4. 递归处理左子树和右子树。 5. 最后输出根节点,完成后遍历。 ### 示例代码 以下是一个实现该逻辑的 Python 代码示例: ```python def build_tree(preorder, inorder): if not preorder: return "" root = preorder[0] root_index = inorder.index(root) left_inorder = inorder[:root_index] right_inorder = inorder[root_index+1:] left_preorder = preorder[1:1+len(left_inorder)] right_preorder = preorder[1+len(left_inorder):] left_postorder = build_tree(left_preorder, left_inorder) right_postorder = build_tree(right_preorder, right_inorder) return left_postorder + right_postorder + root # 示例输入 preorder = "abdgcefh" inorder = "dgbaechf" # 计算后遍历结果 postorder = build_tree(preorder, inorder) print("后遍历结果:", postorder) ``` ### 示例分析 以 `preorder = "abdgcefh"` 和 `inorder = "dgbaechf"` 为例: 1. 前序遍历的第一个字符 `a` 是根节点。 2. 中遍历中 `a` 的位置为索引 3,左边部分 `"dgb"` 是左子树的中遍历,右边部分 `"echf"` 是右子树的中遍历。 3. 根据左子树节点数量(3 个),从前序遍历中提取左子树的前序遍历 `"bdg"` 和右子树的前序遍历 `"cefh"`。 4. 递归处理左子树和右子树,最终合并结果得到后遍历 `"gdbehfca"` [^2]。 ### 复杂度分析 - **时间复杂度**:$O(n^2)$,其中 $n$ 是节点数量。每次递归需要线性时间查找根节点在中遍历中的位置。 - **空间复杂度**:$O(n)$,用于递归调用栈和存储中间结果 [^3]。 ### 相关问题 1. 如何根据后遍历和中遍历前序遍历? 2. 如何通过递归和非递归方法实现前序、中、后遍历? 3. 如何根据二叉树的遍历结果重建二叉树? 4. 如何判断某个遍历序列是否是合法的二叉树遍历结果? 5. 如何优化根据前序和中遍历构建二叉树的算法性能?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值