根据二叉树序列重建二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fenger3790/article/details/82945683

  二叉树有前序、中序、后序、层次四种遍历方式。
  层次遍历我们就不考虑,因为比较简单。
  我们一般是根据前序和中序、中序和后序这两种方式来重建二叉树,注意必须要有中序序列才能唯一确定一棵树。无论是前序和中序、中序和后序构建思路都是一致的。
  重建的思路是采用迭代的思想:
  比如依照前序和中序
  1.我们设定一个函数,把前序和中序传进来,通过前序找到当前的根,并返回根。
  2.在返回根之前,根据中序能知道根的左右子树分别包含哪些数字,我们就把根左边部分的中序和前序传给函数并获取返回值,将该返回值赋给当前节点的left指针;
  3.根的right指针同理,根据根右边部分的中序和前序获取返回值;
  4.重复上述过程,迭代结束就能获取一棵完整的树。
  代码如下:

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        if(pre.size()==0 || vin.size()==0)
            return NULL;
        int root=pre[0];
        vector<int> left_pre,left_vin,right_pre,right_vin;
        bool find_root=false;
        for(int i=0;i<vin.size();i++)
        {
            if(vin[i]==root)//找到根节点
            {
                find_root=true;
                continue;
            }
            if(find_root)
                right_vin.push_back(vin[i]);//右子树中序
            else
                left_vin.push_back(vin[i]);//左子树中序
        }
        for(int i=1;i<pre.size();i++)
        {
            if(left_pre.size()!=left_vin.size())
                left_pre.push_back(pre[i]);//左子树前序
            else
                right_pre.push_back(pre[i]);//右子树前序
        }
        TreeNode *head=new TreeNode(root);
        head->left=reConstructBinaryTree(left_pre,left_vin);
        head->right=reConstructBinaryTree(right_pre,right_vin);
        return head;
    }
};

猜你喜欢

转载自blog.csdn.net/fenger3790/article/details/82945683