JS、JAVA刷题和C刷题的一个很重要的区别

就是最近在做树方面的题时,发现JS和JAVA刷题和C刷题的一个很重要的区别就是传入null的区别

当遍历的时候,C传参数时可以传进去null的指针,因为递归进去,出来时,指针还是指着那个地方

但是JS和JAVA的话,如果传入的不是引用,那么就要通过返回值来记录之前的值,不然的话会丢失之前的状态。

我经常就在null这里犯错误,因为null在C中是null指针,但是在JS和JAVA中null不是引用,仅仅是一种特殊的值。

所以使用JS和JAVA刷关于树递归的题时,最好就是把你要求的值传进去后再返回出来,比如null节点。

比如说拿剑指offer中的26题二叉搜索树与双向链表来说。

我们按照C语言的思想用JS来写就是这样

function Convert(pRootOfTree) {
    // write code here
    if(pRootOfTree == null) return null;
    let pLast=null;
    ConvertNode(pRootOfTree,pLast);
    let pHead=pLast;
    while(pHead&&pHead.left){
        pHead=pHead.left;
    }
    return pHead;
}
function ConvertNode(pNode,pLast){
    if(pNode==null) return;
    if(pNode.left){
        ConvertNode(pNode.left,pLast);
    }
    pNode.left=pLast;
    if(pLast){
        pLast.right=pNode;
    }
    pLast=pNode;
    if(pNode.right){
        ConvertNode(pNode.right,pLast);
    }
}

但是这样无法运行通过,结果为空,为什么呢

这样有一个问题就是如下,当你递归时,到第一层 pLast=null,第二层 pLast=null,到第三层的时候pLast指向了4的那个节点,然后回上去的时候

pLast因为之前第二层是null值,也就是从第二层传进去第三层的时候传的不是地址(只是一个null的值而已),所以从第三层出来第二层的时候,之前的pLast就被清除了,

那么使用的就是第二层的pLast值,也就是此时pLast的值是null.。(可能比较绕口,但是你应该能懂)

好啦渣渣总结完啦,如果你也同时用多种语言的话,希望不要和我踩一样的坑。正确的做法如下

function Convert(pRootOfTree)
{
    // write code here
    if(pRootOfTree == null) return null;
    let pLast=null;
    pLast=ConvertNode(pRootOfTree,pLast);
    let pHead=pLast;
    while(pHead&&pHead.left){
        pHead=pHead.left;
    }
    return pHead;
}
function ConvertNode(pNode,pLast){
    if(pNode==null) return;
    if(pNode.left){
        pLast=ConvertNode(pNode.left,pLast);
    }
    pNode.left=pLast;
    if(pLast){
        pLast.right=pNode;
    }
    pLast=pNode;
    if(pNode.right){
        pLast=ConvertNode(pNode.right,pLast);
    }
    return pLast;
}

原文地址:https://www.cnblogs.com/wuguanglin/p/diffofJSJAVAC.html

时间: 2024-10-10 16:55:04

JS、JAVA刷题和C刷题的一个很重要的区别的相关文章

java 之 --------------- String 面试基础的 题

<span style="font-size:18px;">package stu.love.a; /* 字符串: */ public class StringDemo { public static void main(String[] args) { //字符串是常量:一旦创建了字符串,就不能被改变了 String ss = "hello"; ss = "world"; System.out.println(ss); //特殊情况

【转】js实现上一题,下一题切换小demo

本来我的实现是类似分页,每次上一题,下一题,都去请求一下服务器数据,根据题目序号显示到页面上,但是这样子效率太低下, 这里的demo代码,直接等于是把所有的题目都请求了出来,然后JavaScript控制切换题目了,其实这样子效率可能会更高一点的感觉,感觉是比较好的实现方式了. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测验表2</title&g

欧拉计划(Euler Project)——第一题到第三题

题目一: 10以下的自然数中,属于3和5的倍数的有3,5,6和9,它们之和是23. 找出1000以下的自然数中,属于3和5的倍数的数字之和. package Blog1; public class First { /** * 10以下的自然数中,属于3和5的倍数的有3,5,6和9,它们之和是23.找出1000以下的自然数中,属于3和5的倍数的数字之和. */ public static void main(String[] args) { int sum=0; for (int i=0;i<10

c#认证题第一单元 1题 11题.

第一题: 第11题:

叮咚recovery——想刷什么包就刷什么包

我手机vivo s11t,我之前试过刷机,刷过很多包,发现只有官网下载的相同版本的固件包可以成功刷入,其他的任何的包都不行,我弟弟的手机vivo x3L,遇见和我一样的情况,他想刷小米的MIUI,开始一直失败,后来某一天告诉我他成功刷好了,奇怪,我问了之后发现使用的是叮咚工具箱,这个工具其实就是改变手机默认的recovery为叮咚recovery,叮咚recovery可以刷入其他的固件包如我前面所说的MIUI,所以其实原理就是说之前手机自带的recovery不支持刷入其他的固件包,是有很多限制的

基于Ip的刷投票排名及刷百度推广的自动化实现

所有基于Ip的刷投票排名,只要不涉及用户登录情况,都可以在手机端自动化实现,因为电信运营商的ip地址段是无限的,理论上,飞行模式开关一次,所分配ip地址是变化的,这就有了大量的ip可用 在手机端写个app+自动化点击代码(或者app模拟投票http请求),自动打开关闭飞行模式,循环往复,就以实现 PS: android实现,手机必须root. 承接刷投票和刷百度推广业务,费用详谈 基于Ip的刷投票排名及刷百度推广的自动化实现,布布扣,bubuko.com

一天一道算法题---6.8--数学题

感谢微信平台:一天一道算法题---每天多一点进步----明天 考离散了 明天 高考结束了 看上去都是 好日子..... 上题目了: 求出用1 , 2 ,5这三个数不同个数的组合的和为100的组合个数. 如:100个1是一个组合:5个1+19个5是一个组合 OK:--- 几天折磨后 终于来了个 我能做的.... PS:  关于6.7--栈中O(1)实现min函数等的  应该会在今晚贴上.. 平台上关于这题的分析很到位: 设 1的个数为X 2的个数为Y 5的个数为Z 和为100的组合总数为cnt 1

第二题、第三题、第四题

1.以编程方式操作 HttpCachePolicy 类. HttpCachePolicy.SetExpires HttpCachePolicy.SetCacheability |NoCache|Private|Public|Server|ServerAndNoCache |ServerAndPrivate 2<%@ OutputCache Duration="60" VaryByParam="None" %>Duration 和 VaryByParam

js,java,浮点数运算错误及应对方法

js,java,浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2进制的进制基数是2,那么一个数字只要被因素包含大于2的质数的数除,都会产生无限循环小数.无限循环小数和无理数都无法,和非无限循环的有理数一起用同一种方式存储到存储介质上的同时还保持计算的兼容性. 对于无限循环小数,可以设计一种格式存储到介质上,但是同时又要和非无限循环的有理数能够计算,效率应该会变