二叉树重建

来源:互联网 发布:全国网络电视在线直播 编辑:程序博客网 时间:2024/06/10 10:08

二叉树重建是涉及到二叉树知识点中肯定会遇到的问题。前序加中序遍历,或者中序加后序遍历可以唯一地重建一棵二叉树。

如:给定前序遍历数组{1,2,4,7,3,5,6,8},中序遍历数组{4,7,2,1,5,3,8,6},然后重建一棵二叉树;

思路:在前序遍历数组中第一个数肯定是树的根root->val=1,然后根据root在中序数字的位置可以划分出左子树和右子树的中序遍历,同样又可以知道左子树和右子树的前序遍历,此时有:

左子树的前序数组pre_left={2,4,7}

左子树的中序数组vin_left={4,7,2}

右子树的前序数组pre_right={3,5,6,8}

右子树的中序数组vin_right={5,3,8,6}

这样依次递归下去,就可以得到每一个结点,代码如下:

    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {        //如果是空,则返回        if(pre.empty() || vin.empty())return NULL;        //根据前中序列,构造左右子树的前中序列        vector<int>pre_left;        vector<int>pre_right;        vector<int>vin_left;        vector<int>vin_right;        //确定根结点        int value = pre[0];        TreeNode* btree = new TreeNode(value);        //得出左右子树前中序列的数组        int i= 0;        while(vin[i] != value){            vin_left.push_back(vin[i]);            pre_left.push_back(pre[i+1]);            i++;        }        for(int j = i+1;j<vin.size();j++){            vin_right.push_back(vin[j]);            pre_right.push_back(pre[j]);        }        //依次递归下去        btree->left=reConstructBinaryTree(pre_left,vin_left);        btree->right=reConstructBinaryTree(pre_right,vin_right);                return btree;    }

如果是中序加后序遍历,也是一样的,可以根据后序遍历数组得出根结点的值。

原创粉丝点击