题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化:以某种顺序遍历二叉树,NULL的位置用特殊字符代替
1
2 3
4 5 6 7
前序 序列化:1,2,4,#,#,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;
}
};