剑指offer 61、62:序列化二叉树 、二叉搜索树的第k个结点

题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化:以某种顺序遍历二叉树,NULL的位置用特殊字符代替

            1
    2               3
4       5     6          7
前序 序列化:124#,#,5,#,#,3,#,#,6,#,#,7,#,#,
使用逗号的原因,分割字符,例如节点值为11的话。字符串是 ,1  1,如果没有逗号无法判断是不是一个整数。
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    string data="";
    void process(TreeNode *root,string &data)//构建字符串
    {
        if(root==NULL)
        {
            data=data+"#,";
            return;
        }
        data+=to_string(root->val);
        data+=",";
        process(root->left,data);
        process(root->right,data);
    }
    char* Serialize(TreeNode *root) {//以char*类型输出
        process(root,data);
        char *result=new char[data.size()+1];
        for(int i=0;i<data.size();++i)
            result[i]=data[i];
        result[data.size()]='\0';
        return result;
    }
    TreeNode* Deserialize(char *str) {//反序列化
        if(str == NULL)
            return NULL;
        TreeNode *ret = Deserialize(&str);//**str,每次移动*str
        return ret;
    }
    TreeNode* Deserialize(char **str) {//如果采用*str,递归时str一直向前,并不会保留原有信息,导致右子树无法遍历
        if(**str=='#')
        {
            *str+=2;
            return NULL;
        }
        int num=0;
        while(**str!='\0' && **str !=',')
        {
            num=num*10+**str-'0';
            *str+=1;
        }
        *str+=1;
        TreeNode *head=new TreeNode(num);
        if(**str=='\0')
            return head;
        head->left=Deserialize(str);
        head->right=Deserialize(str);
        return head;
    }
};

62.题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
思路:中序遍历就是有序的

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    int index=0;
    TreeNode* KthNode(TreeNode* pRoot, int k)
    {
        if(pRoot!=NULL && k>0)//前提条件
        {
            TreeNode* pleft=KthNode(pRoot->left,k);//中序遍历
            if(pleft!=NULL)//如果找到了,返回值肯定不为NULL,为pRoot。没找到就为NULL
                return pleft;
            index+=1;
            if(index==k)
                return pRoot;
            TreeNode* pright=KthNode(pRoot->right,k);
            if(pright!=NULL)
                return pright;
        }
        return NULL;
    }


};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值