文章标题

来源:互联网 发布:dede免费源码站 编辑:程序博客网 时间:2024/06/05 05:51

根据前序和中序遍历重建二叉树

class Solution {public:    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {        if(preorder.size() == 0 || inorder.size() == 0)            return NULL;        int start = 0;        int pend = preorder.size() - 1;        int iend = inorder.size() - 1;        return helper(preorder,0,pend,inorder,0,iend);    }    TreeNode* helper(vector<int> preorder,int pstart,int pend,vector<int> inorder,int istart,int iend){        if(pstart > pend || istart > iend)            return NULL;        int key = preorder[pstart];        TreeNode* root = new TreeNode(key);        int count = 0;        if(pstart == pend)            return root;        while (inorder[istart+count]!=key )        {            count++;        }        int pleft_start = pstart+1;        int pleft_end = pstart + count;        int pright_start = pleft_end + 1;        int pright_end = pend;        int ileft_start = istart;        int ileft_end = ileft_start + count - 1;        int iright_start = ileft_end + 2;        int iright_end = iend;        root->left = helper(preorder,pleft_start,pleft_end,inorder,ileft_start,ileft_end);        root->right = helper(preorder,pright_start,pright_end,inorder,iright_start,iright_end);        return root;    }};

给定中序遍历和后序遍历

class Solution {public:    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {        if(postorder.size() == 0 || inorder.size() == 0)            return NULL;        int start = 0;        int pend = postorder.size() - 1;        int iend = inorder.size() - 1;        return helper(postorder,0,pend,inorder,0,iend);    }    TreeNode* helper(vector<int>& postorder,int pstart,int pend,vector<int>& inorder,int istart,int iend){        if(pstart > pend || istart > iend)            return NULL;        int key = postorder[pend];        TreeNode* root = new TreeNode(key);        int leftcount = 0;        if(pstart == pend)            return root;        //求左子树个数        while (inorder[istart+leftcount]!=key )        {            leftcount++;        }        //求右子树个数,总共的个数-左子树个数        int rightcount = iend - istart -leftcount ;        //计算后序遍历的位置        int pright_start = pend - rightcount;        int pright_end = pend -1;        int pleft_start = pstart;        int pleft_end = pstart + leftcount -1;        //计算中序遍历的位置        int ileft_start = istart;        int ileft_end = ileft_start + leftcount - 1;        int iright_start = ileft_end + 2;        int iright_end = iend;        root->left = helper(postorder,pleft_start,pleft_end,inorder,ileft_start,ileft_end);        root->right = helper(postorder,pright_start,pright_end,inorder,iright_start,iright_end);        return root;    }};
0 0