Leet Code 897. 递增顺序查找树——————(记得不用全局变量再而是指针传参试一试)(力扣老哥用的模拟栈的中序,太妙了)

给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
在这里插入图片描述

题目地址:递增顺序查找树
或直转到: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的底层机制还是什么的。我想我以后还是要再进行尝试的,现在先用全局变量解决这道题,其实在我看来,只要是用全局变量就已经输了,输的彻彻底底。

这道题以后要用指针再试一遍!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值