数据结构-树-应用题-5.3-15

post[h2]=pre[l1]表示后序序列的最后一个结点(根节点)等于先序序列的第一个结点

void PreToPost(ElemType pre[],int l1,int,h1,ElemType post[],int l2,int h2){
    int half;
    if(h1>=l1){
        post[h2]=pre[l1];
        half=(h1-l1)/2;
        PreToPost(pre,l1+1,h1+half,post,l2,l2+half-1);
        PreToPost(pre,l1+half+1,h1,post,l2+half,h2-1);
    }
}

### 函数 `PreToPost`

```cpp
void PreToPost(ElemType pre[], int l1, int h1, ElemType post[], int l2, int h2){
```

- **函数定义**:这个函数用来将给定的前序遍历序列 `pre`(以数组形式存储)转换为后序遍历序列 `post`。

```cpp
    int half;
```

- **定义变量**:`half` 变量用来存储前序序列的一半长度。

```cpp
    if(h1 >= l1){
```

- **条件检查**:如果前序序列的起始索引 `l1` 小于等于结束索引 `h1`,说明序列中还有元素需要处理。

```cpp
        post[h2] = pre[l1];
```

- **根节点处理**:将前序序列的第一个元素(根节点)放入后序序列的最后位置。

```cpp
        half = (h1 - l1) / 2;
```

- **计算一半长度**:计算前序序列中剩余部分的一半长度,以便将序列分成左右子树。

```cpp
        PreToPost(pre, l1 + 1, h1 + half, post, l2, l2 + half - 1);
```

- **左子树处理**:递归调用 `PreToPost` 函数处理前序序列左子树部分,并将结果存储到后序序列中的左子树区域。

```cpp
        PreToPost(pre, l1 + half + 1, h1, post, l2 + half, h2 - 1);
```

- **右子树处理**:递归调用 `PreToPost` 函数处理前序序列右子树部分,并将结果存储到后序序列中的右子树区域。

递归参数的设置

### 第一次递归调用:

```cpp
PreToPost(pre, l1 + 1, h1 + half, post, l2, l2 + half - 1);
```

1. `pre`:前序序列。递归调用时,我们要处理的是当前节点的左子树,所以前序序列的起始索引应该是当前节点的下一个节点,即 `l1 + 1`。
2. `l1 + 1`:前序序列左子树的起始索引。这是因为当前节点已经被处理,所以我们需要移动到左子树的第一个节点。
3. `h1 + half`:前序序列左子树的结束索引。这是因为左子树的长度是 `half`,所以结束索引应该是当前节点的结束索引加上左子树长度。
4. `post`:后序序列。左子树的遍历完成后,我们需要将结果存储到后序序列中。
5. `l2` 和 `l2 + half - 1`:后序序列左子树的起始和结束索引。由于后序序列是先遍历左子树,所以左子树的部分应该紧跟在根节点之后,而根节点的位置在 `l2` 处,左子树的长度是 `half`,所以结束索引应该是 `l2 + half - 1`。

### 第二次递归调用:

```cpp
PreToPost(pre, l1 + half + 1, h1, post, l2 + half, h2 - 1);
```

1. `pre`:前序序列。这次递归调用要处理的是当前节点的右子树,所以前序序列的起始索引应该是当前节点的右子树的第一个节点,即 `l1 + half + 1`。
2. `l1 + half + 1`:前序序列右子树的起始索引。这是因为左子树和当前节点已经被处理,所以我们需要移动到右子树的第一个节点。
3. `h1`:前序序列右子树的结束索引。右子树的结束索引应该和当前节点的结束索引相同。
4. `post`:后序序列。右子树的遍历完成后,我们需要将结果存储到后序序列中。
5. `l2 + half` 和 `h2 - 1`:后序序列右子树的起始和结束索引。由于后序序列是在左子树之后遍历右子树,而左子树的部分已经存储在后序序列中,所以右子树的部分应该从左子树部分的后一个位置开始存储,即 `l2 + half`,而右子树的长度是 `half`,所以结束索引应该是 `h2 - 1`。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值