传送门:https://leetcode-cn.com/probl...
学二叉树时,有一条性质是
“如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一颗二叉树”
所以对于这题来说,总的思路可以按照这条性质来解。由于题目的条件是“平衡二叉树”,所以解题过程可以更进一步简化为:
对于每一棵子树,其序列化串为S,

  • 若可以找到子串S[i1....in]>S[0],则按照i1将S分割为左子树与右子树;
  • 若不能找到这样的子串,说明其都在左子树上;
  • 相对应的,若i1 = 1,即都在右子树上。

递归上面的过程既可将序列化串反序列化。
由于树的结构,序列化时按','将每个节点分隔开。

class Codec {
public:
    string serialize(TreeNode* root) {
        string result;
        getFront(root,result);
        return result;
    }
    void getFront(TreeNode* root,string &result){
        if(!root) return;
        result+=to_string(root->val)+",";
        if(root->left){getFront(root->left,result);}
        if(root->right){getFront(root->right,result);}
    }

    TreeNode* deserialize(string data) {
        if(data.length()==0||data.length()==1) return 0;
        TreeNode *result = new TreeNode;
        int i=0;result->val = 0;
        for(;data[i]!=','&&i<data.length();++i){
            result->val = result->val * 10 + data[i]-'0';
        }
        //求解S[i1....in],begin指向第一个字符,end指向最后一个','
        string left,right;int start = ++i;int end = i-1;
        for(;i<data.length();++i){
            int tmp = 0;
            for(;data[i]!=',';++i){
                tmp=tmp * 10 + data[i]-'0';
            }
            if(tmp>result->val) break;
            else end = i;
        }
        if(start<end){
            left = data.substr(start,end-start+1);
            TreeNode *nl = deserialize(left);
            if(nl) result->left = nl;
        }
        if(end!=data.length()-1){
            right = data.substr(end+1,data.length()-end);
            TreeNode *nr = deserialize(right);
            if(nr) result->right = nr;
        }
        return result;
    }
};

image.png
效果一般
尝试一下层次遍历
按照层次遍历生成序列化串,若节点为空,则生成空格代替数字。
难点在于重新生成树。容易理解,由于生成串时将空节点的位置也留了出来,在反序列化时,再次按照根节点进行遍历,序列化串每个点的位置是相对应的。
再次层次遍历:

TreeNode* deserialize(string data) {
        if(data.length()==0) return 0x00;
        TreeNode *result = new TreeNode();
        queue<TreeNode*> que;
        que.push(result);
        for(int i=0;i<data.length();++i){
            int tmp = 0;
            TreeNode *tmpN = que.front();
            que.pop();
            if(data[i]==' '){
                if(tmpN->left)  tmpN->left->left = 0x00;
                if(tmpN->right) tmpN->right->right = 0x00;
                ++i;continue;
            }
            for(;data[i]!=',';++i) tmp = tmp*10 + data[i]-'0';
            tmpN->val = tmp;
            //在这里就要分配空间。当压进队列取出来后再分配空间则接不上其父节点
            tmpN->left  = 0x00;tmpN->left = new TreeNode();
            //借用左节点,若为空则能够找到父节点,并将父节点左子树置空。同右节点
            tmpN->left->left=tmpN;
            que.push(tmpN->left);
            tmpN->right = 0x00;tmpN->right = new TreeNode();
            tmpN->right->right=tmpN; 
            que.push(tmpN->right);
        }
        return  result;
    }

结果是好了点。
image.png

297题同该题https://leetcode-cn.com/probl...
只需要利用层次遍历的方法(因为这道题是二叉树,非平衡树,方法1不适用)
只需要判断+-一下即可


HHXXHGGZ
0 声望0 粉丝

« 上一篇
LeetCode 76
下一篇 »
LeetCode 1195