数据结构---由二叉树的中序遍历和后序遍历,构建二叉树

本文主要讲解如何根据二叉树的中序遍历和后序遍历,构建二叉树。
在写PTA的钻石争霸赛最后一道题时,刚开始需要根据二叉树的中序遍历和后序遍历,构建二叉树,然后才能继续写题。当时经过向学长学习之后,完成了那道题。并且对这个算法有了初步的了解。
今天写了PAT–L2-006 树的遍历这道题,发现这个算法知道原理之后,理解起来很简单。
PAT–L2-006 树的遍历 (25 分)

本文分为两个部分

  1. 中序遍历与后序遍历的关系
  2. 利用中序遍历和后序遍历构建树

1.中序遍历与后序遍历的关系

数据结构---由二叉树的中序遍历和后序遍历,构建二叉树_第1张图片
中序遍历: 先遍历左子树,在遍历根节点,最后遍历右子树。
后序遍历: 先遍历左子树,再遍历右子树,最后遍历根节点。
中序遍历序列: 4 2 5 1 6 3 7
后序遍历序列: 4 5 2 6 7 3 1

从中序遍历遍历和后序遍历序列,再结合图我们可以得到它们之间的联系:

  1. 后序遍历最后一个结点是根节点,中序遍历根节点左边是左子树,右边是右子树
  2. 后序遍历左子树和中序遍历左子树都是序列前相同的位数,只是子树中的遍历方式不同。.
  3. 后序遍历右子树是遍历完左子树之后,中序遍历右子树是遍历完根之后,它们之间在序列中的位置差一位,也只是子树的遍历的方式不同。

2. 利用中序遍历和后序遍历构建树

经过上述比较,我们可以得出,中序遍历和后序遍历都是先遍历左子树,之后就是根节点和右子树的遍历顺序不同。中序遍历先遍历根节点在遍历右子树;后序遍历先遍历右子树再遍历根节点,所以后序遍历序列中最后一个元素就是根节点。在中序遍历中找到根节点的位置,就可以得到左右子树的中序遍历序列,然后在结合左右子树的后序遍历,得到其根节点,然后继续根据其子树的子树的中序遍历和后序遍历找到其根节点,一直递归下去直到将树构建完成。

int a[31]; //中序遍历
int b[31]; //后序遍历
//l1为中序遍历序列的最左端;r1为中序遍历序列的最右端
//l2为后序遍历序列的最左端;r2为后序遍历序列的最右端
Node *build(int l1, int r1, int l2, int r2)
{
    Node *root = new Node;
    root->data = b[r2];//后序遍历最后一个结点为根节点
    int i = 0;
    while (a[l1 + i] != b[r2])//查找根节点在中序遍历序列中的位置
    {
        i++;
    }
    //a[l1+i]为根节点
    //构建左子树
    if (i > 0)
    {
        root->lchild = build(l1, l1 + i - 1, l2, l2 + i - 1);
    }
    else
    {
        root->lchild = NULL;
    }
    //构建右子树
    if (l1 + i < r1)
    {
        root->rchild = build(l1 + i + 1, r1, l2 + i, r2 - 1);
    }
    else
    {
        root->rchild = NULL;
    }
    return root;
}

大家好,我是Lucky_追梦仔。一个正在学习编程的小白,希望我的博文,可以帮助到您学习,或者解决您遇到的问题。

你可能感兴趣的:(数据结构,数据结构,算法,二叉树)