669. Trim a Binary Search Tree

Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that all its elements lies in [L, R] (R >= L). You might need to change the root of the tree, so the result should return the new root of the trimmed binary search tree.
Example 1:
Input:
1
/
0 2
L = 1
R = 2
Output:
1
\
2

通過這道題我明白了「形參,實(shí)參」這個(gè)概念颊郎。
1.形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元萧求,在調(diào)用結(jié)束時(shí)历帚, 即刻釋放所分配的內(nèi)存單元。因此甸昏,形參只有在函數(shù)內(nèi)部有效谋右。 函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。

一開始我的代碼:

        if (root == null) return null;
        if (root.val < L) {
            root = root.right;
            return trimBST(root, L, R);
        }
        if (root.val > R) {
            root = root.left;
            return trimBST(root, L, R);
        }
        if (root.left != null && root.left.val < L) {
            root.left = root.left.right;
        }
        if (root.right != null && root.right.val > R) {
            root.right = root.right.left;
        }
        root.left = trimBST(root.left, L, R);
        root.right = trimBST(root.right, L, R);
        return root;
    }

注意

        root.left = trimBST(root.left, L, R);
        root.right = trimBST(root.right, L, R);

起初我想不通為什么要給root.left和root.right賦值炫彩,明明我已經(jīng)在遞歸中改變了它的孩子的內(nèi)存了啊(root = root.right)絮短。但是由于進(jìn)入了一個(gè)新的函數(shù)江兢,這樣做其實(shí)并沒有改變它孩子的內(nèi)存,而是制造了一個(gè)新的引用(棧內(nèi)存)指向了root.right丁频;而如果這時(shí)我改變r(jià)oot.right的值杉允,root.right會(huì)指向另一塊內(nèi)存,始終不會(huì)對(duì)root造成影響限府。

    public TreeNode trimBST(TreeNode root, int L, int R) {
        if (root == null) return null;
        if (root.val < L) {
            return trimBST(root.right, L, R);
        }
        if (root.val > R) {
            return trimBST(root.left, L, R);
        }
        if (root.left != null && root.left.val < L) {
            root.left = root.left.right;
        }
        if (root.right != null && root.right.val > R) {
            root.right = root.right.left;
        }
        root.left = trimBST(root.left, L, R);
        root.right = trimBST(root.right, L, R);
        return root;
    }

Or:

    public TreeNode trimBST(TreeNode root, int L, int R) {
        if (root == null) return null;
        
        if (root.val < L) return trimBST(root.right, L, R);
        if (root.val > R) return trimBST(root.left, L, R);
        
        root.left = trimBST(root.left, L, R);
        root.right = trimBST(root.right, L, R);
        
        return root;
    }

Dec 7 2017 review

今天又蒙逼了夺颤,不知怎么又繞內(nèi)存/引用的問題上了痢缎,我寫了一段測試代碼胁勺,發(fā)現(xiàn)在函數(shù)里改變一個(gè)對(duì)象,那個(gè)對(duì)象竟然真的被改變了独旷。比如我初始化一個(gè)數(shù)組是{1,2,3}(數(shù)組是對(duì)象署穗,它是new出來的),在函數(shù)里改變數(shù)組第三個(gè)元素的值嵌洼,我預(yù)想的是案疲,因?yàn)楹瘮?shù)和它的參數(shù)是保存在方法區(qū)的,函數(shù)參數(shù)中的數(shù)組麻养,其實(shí)只是一個(gè)指向原來arr的引用褐啡,所以我在函數(shù)中改變arr又沒有return回去,按理說是數(shù)組還會(huì)是{1,2,3}吧鳖昌,但事實(shí)并非如此备畦,函數(shù)執(zhí)行完后arr被改變了。我的世界觀又一次崩塌了许昨。懂盐。。


image.png

然后我看了下這個(gè)blog
里的例子糕档,看到String拼接那部分才發(fā)現(xiàn)原因莉恼。其實(shí)這個(gè)我早就知道,只是長期不刷算法忘記了。俐银。我傳入的int數(shù)組尿背,參數(shù)里的arr確實(shí)只是一個(gè)引用沒錯(cuò),但是我改變的不是這個(gè)對(duì)象的引用悉患,我改變的是它里面的元素残家。

我在上面說過,「而如果這時(shí)我改變r(jià)oot.right的值售躁,root.right會(huì)指向另一塊內(nèi)存坞淮,始終不會(huì)對(duì)root造成影響。」為什么會(huì)指向另一塊內(nèi)存陪捷,而不是直接在原來的堆內(nèi)存上修改回窘?用形參實(shí)參來解釋其實(shí)不太嚴(yán)謹(jǐn),下面是我看的另外一個(gè)問題得出的思考:
靜態(tài)方法會(huì)導(dǎo)致內(nèi)存泄露嗎市袖?

這種寫法不會(huì)造成內(nèi)存泄漏啡直。為什么不會(huì)呢?要想造成內(nèi)存泄漏苍碟,你的工具類對(duì)象本身要持有指向傳入對(duì)象的引用才行酒觅!但是當(dāng)你的業(yè)務(wù)方法調(diào)用工具類的靜態(tài)方法時(shí),會(huì)生產(chǎn)一個(gè)稱為棧幀(stack frame)的東西(每次方法調(diào)用微峰,JVM都會(huì)生成一個(gè)棧幀)舷丹,當(dāng)方法調(diào)用結(jié)束返回的時(shí)候,當(dāng)前方法棧幀就已經(jīng)被彈出了并且被釋放掉了蜓肆。 整個(gè)過程結(jié)束時(shí)颜凯,工具類對(duì)象本身并不會(huì)持有傳入對(duì)象的引用。

也就是說之前理解的并不對(duì)仗扬,傳入的參數(shù)并不是對(duì)象的引用症概,而是一個(gè)棧幀(stack frame),或者說棧幀的一部分早芭,我猜是放在stack frame的局部變量變里彼城。對(duì)象的引用存在虛擬機(jī)棧,棧幀也存放在虛擬機(jī)棧退个,其實(shí)也就是通常理解的棧內(nèi)存募壕,每個(gè)棧幀都有自己的局部變量表≈钠颍可以這么理解司抱,對(duì)象的引用劫持了對(duì)象,指向了對(duì)象在堆內(nèi)存中的首地址黎烈,通過等于號(hào)賦值的都是引用傳遞习柠,但是棧幀中的那個(gè)「參數(shù)」沒有改變堆內(nèi)存的權(quán)利匀谣,如果要改變它指向的對(duì)象,只能自己重新創(chuàng)建一塊內(nèi)存资溃。

每當(dāng)一個(gè)java方法被執(zhí)行時(shí)都會(huì)在虛擬機(jī)中新創(chuàng)建一個(gè)棧幀武翎,方法調(diào)用結(jié)束后即被銷毀。
棧幀存儲(chǔ)空間為虛擬機(jī)棧溶锭,每一個(gè)棧幀都有自己的局部變量表宝恶、操作數(shù)棧和指向當(dāng)前方法所屬的類的運(yùn)行時(shí)常量池的引用。
在每個(gè)線程中趴捅,只有目前正在執(zhí)行的那個(gè)方法的棧幀是活動(dòng)的垫毙。這個(gè)棧幀就稱為當(dāng)前棧幀(current frame),這個(gè)棧幀對(duì)應(yīng)的方法稱之為當(dāng)前方法(current method)拱绑。定義這個(gè)方法的類就稱之為當(dāng)前類(current class)综芥。對(duì)局部變量表和操作數(shù)棧的各種操作,通常都指的是對(duì)當(dāng)前棧幀的局部變量表和操作數(shù)棧進(jìn)行的操作猎拨。如下圖所示膀藐,

如果用全局變量,就不會(huì)有這種問題了红省。

我感覺我真的有點(diǎn)鉆牛角尖了额各。。
貼一個(gè)我的回答:
https://www.zhihu.com/question/27764932/answer/272648864

ref:
https://www.cnblogs.com/editice/p/5420716.html
http://blog.csdn.net/zgrjkflmkyc/article/details/8774511

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吧恃,一起剝皮案震驚了整個(gè)濱河市虾啦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚜枢,老刑警劉巖缸逃,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件针饥,死亡現(xiàn)場離奇詭異厂抽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丁眼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門筷凤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苞七,你說我怎么就攤上這事藐守。” “怎么了蹂风?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵卢厂,是天一觀的道長。 經(jīng)常有香客問我惠啄,道長慎恒,這世上最難降的妖魔是什么任内? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮融柬,結(jié)果婚禮上死嗦,老公的妹妹穿的比我還像新娘。我一直安慰自己粒氧,他們只是感情好越除,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著外盯,像睡著了一般摘盆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饱苟,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天骡澈,我揣著相機(jī)與錄音,去河邊找鬼掷空。 笑死肋殴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坦弟。 我是一名探鬼主播护锤,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酿傍!你這毒婦竟也來了烙懦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤赤炒,失蹤者是張志新(化名)和其女友劉穎氯析,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莺褒,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掩缓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遵岩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片你辣。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尘执,靈堂內(nèi)的尸體忽然破棺而出舍哄,到底是詐尸還是另有隱情,我是刑警寧澤誊锭,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布表悬,位于F島的核電站,受9級(jí)特大地震影響丧靡,放射性物質(zhì)發(fā)生泄漏蟆沫。R本人自食惡果不足惜叉讥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饥追。 院中可真熱鬧图仓,春花似錦、人聲如沸但绕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捏顺。三九已至六孵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幅骄,已是汗流浹背劫窒。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拆座,地道東北人主巍。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像挪凑,于是被迫代替她去往敵國和親孕索。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • EasyGiven a binary search tree and the lowest and highest...
    greatseniorsde閱讀 231評(píng)論 0 0
  • 題目 Given a binary search tree and the lowest and highest ...
    Eazow閱讀 355評(píng)論 0 0
  • 原題: 所犯的錯(cuò)誤: 開始21,28行沒有做賦值給root躏碳,導(dǎo)致出錯(cuò)搞旭。root是作為對(duì)象傳入給函數(shù)的,如果不將返回...
    小雙2510閱讀 189評(píng)論 0 0
  • 每次看到好的文章和句子菇绵,都會(huì)立刻收藏進(jìn)印象筆記里肄渗。潛意識(shí)認(rèn)為,掌握了許多有用的知識(shí)和道理咬最,就會(huì)越來越趨向更完美的自...
    藍(lán)夢_寶貝閱讀 830評(píng)論 0 3
  • 2年前一個(gè)scala程序員跑過來問:老楊你們java中要返回2個(gè)或者是多個(gè)對(duì)象的時(shí)候怎么辦翎嫡? 我: java只有返...
    Thomas的簡書閱讀 401評(píng)論 0 0