给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
题目地址:递增顺序查找树
或直转到:https://leetcode-cn.com/problems/increasing-order-search-tree/
我的题解:
int i[101];//对不起,我用全局变量了,我是癌症晚期,对不起,我都这样了你为什么不顺从我呢?
// 我就想吃点好的,早餐加个鸡蛋,晚餐加个鸡腿,午饭吃两个馒头三两饭。
int j=0;//我寻思反正都用了一个了,再用一个也没事8???
typedef struct{
struct TreeNode* tree;
}Tree;//树根结构体
//struct TreeNode* connect(struct TreeNode* root,struct TreeNode* formerone){
// ;
//} 我本来是想通过前一个参数的传入来进行递归的赋值,之后才发现没有我想的那么简单,我决定用一个简单的思路
struct TreeNode* creat(int value){
struct TreeNode* node=(struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val=value;
node->right=NULL;
node->left=NULL;
return node;
}//一个新结点的创建(无指向)
void zhongxubianli(struct TreeNode* root){
if(root!=NULL){
zhongxubianli(root->left);
i[j]=root->val;
j++;
zhongxubianli(root->right);
}
}//进行中序遍历
struct TreeNode* increasingBST(struct TreeNode* root){
int* numss,numsshadow;
Tree Mytree;
struct TreeNode* temp;
int xunhuan=0;
for(xunhuan=0;xunhuan<101;xunhuan++){
i[xunhuan]=-1;
}
numss=(int*)malloc(sizeof(int)*100);
numsshadow=numss;//用影子地址的移动代替nums移动
zhongxubianli(root);//将数组中前面的部分都装上所给二叉树从小到大排序的值
j=0;
if(root!=NULL){
Mytree.tree=creat(i[j]);
temp=Mytree.tree;
j++;
}//初始化根节点
while(i[j]!=-1){
temp->right=creat(i[j]);
temp=temp->right;
j++;//指针后移
}
j=0;
for(xunhuan=0;xunhuan<101;xunhuan++){
i[xunhuan]=-1;
}
return Mytree.tree;
}//题目所给函数
最简单的思路,就是中序遍历到所有结点中val从小到大装入一个数组中。然后创建通过判断遍历结点数量来创建对应数量的node,一路向又就可以。
其实我在做题过程中遇到了一些问题,就是在中序遍历传参的过程中即使使用指针传参,也会在递归的过程中被初始化,不明白是C的底层机制还是什么的。我想我以后还是要再进行尝试的,现在先用全局变量解决这道题,其实在我看来,只要是用全局变量就已经输了,输的彻彻底底。
这道题以后要用指针再试一遍!