算法与数据结构基础(三)之重建二叉树

算法与数据结构基础(三)之重建二叉树

  • 0、简介
  • 1、已知前序、中序遍历,求后序遍历
  • 2、已知中序、后序遍历,求前序遍历
  • 3、已知前序、后序遍历,求中序遍历
  • 代码实现

0、简介

  1. 前序遍历(根–>左–>右)
  2. 中序遍历(左–>根–>右)
  3. 后序遍历(左–>右–>根)

1、已知前序、中序遍历,求后序遍历

已知:

前序遍历: ABGDECFH

中序遍历: GBEDAFCH

重建二叉树并求后序遍历

  1. 重建二叉树
    算法与数据结构基础(三)之重建二叉树_第1张图片
    算法与数据结构基础(三)之重建二叉树_第2张图片
    算法与数据结构基础(三)之重建二叉树_第3张图片

2.求得后序遍历:GEDBFHCA

2、已知中序、后序遍历,求前序遍历

已知:

中序遍历: GBEDAFCH

后序遍历:GEDBFHCA

重建二叉树并求前序遍历

  1. 重建二叉树
    步骤和上面的类似,还是得先找出根结点,由后序遍历的特点,根结点root在最后,所以根结点为A,再由中序遍历可以知道左子树和右子树分别为GBED、FCH;再按照上面的步骤递归分别求出左右子树即可得解。
  2. 求得前序遍历: ABGDECFH

3、已知前序、后序遍历,求中序遍历

已知前序、中序或者中序、后序都可以唯一确定一棵二叉树,但是已知前序、后序是无法唯一确定一棵二叉树的,解不唯一。
参考文章:https://blog.csdn.net/qq_34154570/article/details/82700094

代码实现

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector pre,vector vin)
    {
        // 递归出口
        if(pre.empty()||vin.empty())
            return nullptr;
         
        // 建立根节点
        TreeNode *head = new TreeNode(pre[0]);
         
        // 查找中序遍历中根节点的索引值
        int root=0;
        for(int i = 0;i pre_left,pre_right,vin_left,vin_right;
         
        for(int i =0;ileft = reConstructBinaryTree(pre_left,vin_left);
        head->right = reConstructBinaryTree(pre_right,vin_right);
         
        return head;
    }
};

你可能感兴趣的:(C++,算法与数据结构)