101. ๋Œ€์นญ ํŠธ๋ฆฌ ๐Ÿš€

์†”๋ฃจ์…˜ ๊ฐœ๋ฐœ:



JavaScript



์งˆ๋ฌธ ์„ค๋ช…



๋”ฐ๋ผ์„œ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ๋Œ€์นญ ํŠธ๋ฆฌ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋ฌด์—์„œ ๋ณด๋ฉด ๊ฑฐ์šธ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋ฏธ๋Ÿฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์–ด์ง„ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ž์‹์€ ๋ฏธ๋Ÿฌ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋Ÿฌ๋ง๋œ ์˜๋ฏธ๋Š” ํŠธ๋ฆฌ์˜ left ์ชฝ์—์„œ ํŠธ๋ฆฌ์˜ right ์ชฝ์ด ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ–์ง€๋งŒ ์ž์‹์ด ์„œ๋กœ ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋“ค๋ฆฌ๊ณ  ์กฐ๊ธˆ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ์ ์œผ๋กœ ๋งํ•˜๋ฉด ์ƒ์ƒํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ ค๋ฉด ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.


๊ถŒ์žฅ ์ง€์‹


  • Binary Trees
  • Binary Tree Traversals
  • Post Order Traversal
  • Javascript Call Stack

  • ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?


  • ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ๋Œ€์นญ ํŠธ๋ฆฌ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์˜๋ฏธ๋Š” ๋‚˜๋ฌด์—์„œ ๊ฑฐ์šธ์˜ ๊ฒƒ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋Ÿฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์–ด์ง„ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ž์‹์€ ๋ฏธ๋Ÿฌ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์ฃผ์–ด์ง„ ๋…ธ๋“œ์—์„œ ๊ทธ ์ž์‹์ด ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•˜์ง€๋งŒ ๊ทธ๋“ค์˜ ์ž์‹์ด ์„œ๋กœ ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ์ชฝ์€ ์™ผ์ชฝ์— ์žˆ๊ณ  ๋‹ค๋ฅธ ์ชฝ์€ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

  • ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€:



    ํŠธ๋ฆฌ์˜ ์–‘์ชฝ์—์„œ ๋™์‹œ์— ์‚ฌํ›„ ์ˆœํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์™ผ์ชฝ์—์„œ๋Š” ์ตœ๋Œ€ํ•œ ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๊ณ  ์˜ค๋ฅธ์ชฝ์—์„œ๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค. ์–‘์ชฝ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋“ค์ด ๊ฐ™๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ๋‚˜์œ ๋‚˜๋ฌด๋ผ๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค.

    ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์žฌ๊ท€์ ์œผ๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ฒซ์งธ, ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ์— ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ์™ผ์ชฝ ํŠธ๋ฆฌ์™€ ์˜ค๋ฅธ์ชฝ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๊ฐ€ ๋น„์–ด ์žˆ๋Š”์ง€ ๋ฌป์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์—†์ด ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋์— ๋„๋‹ฌํ–ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์นญ ํŠธ๋ฆฌ๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ '์™ผ์ชฝ ๋ฐ ์˜ค๋ฅธ์ชฝ ํŠธ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ๋น„์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?'๋ผ๊ณ  ๋ฌป์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ๋‚˜์œ ๋‚˜๋ฌด๋ผ๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค false
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‘ ํŠธ๋ฆฌ์˜ ๊ฐ’์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. 'ํ˜„์žฌ ์™ผ์ชฝ ๊ฐ’์ด ํ˜„์žฌ ์˜ค๋ฅธ์ชฝ ๊ฐ’๊ณผ ๊ฐ™์€๊ฐ€์š”?' ์ด ๊ฒฝ์šฐ ๋Œ€์นญ ๋…ธ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹คfalse.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ํŠธ๋ฆฌ๊ฐ€ ์†Œ์ง„๋  ๋•Œ๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ ๋ฐ ์™ผ์ชฝ ํŠธ๋ฆฌ๋ฅผ ๊ณ„์† ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  nodes๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด ๋‚˜๋ฌด๊ฐ€ ๋Œ€์นญ์ธ์ง€ ๋ฌป์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๊ณ  ๋Œ€์นญ์ธ์ง€ ํ™•์ธํ–ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด true ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋””์—์„œ๋‚˜ false๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์Šคํƒ์„ ํ†ตํ•ด ๋ฒ„๋ธ”๋ง๋˜์–ด ์ž˜๋ชป๋œ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ํŠธ๋ฆฌ์ž„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋ชจ๋‘ ์ฐธ์ด๋ฉด true ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•:


  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) | ์—ฌ๊ธฐ์„œ n์€ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ ์ˆ˜ | ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ์ „์ฒด ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: O(h) | ํ˜ธ์ถœ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ | ํ•˜์ง€๋งŒ ์ตœ์•…์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ **O(n)**์ด๋ผ๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜ธ์ถœ ์Šคํƒ์—๋Š” ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๋งŒํผ์˜ ๋…ธ๋“œn๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ' ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์„๊นŒ? ' ์˜ˆ! Morris Traversal์€ O(1) ๊ณต๊ฐ„ ๋ณต์žก์„ฑ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Morris Traversal์€ ์ฝ๊ธฐ ๊นŒ๋‹ค๋กญ๊ณ  ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ๋ฆฌํŠธ์ฝ”๋“œ ๊ฒฐ๊ณผ:



    ์ œ์ถœ ๋งํฌ ์ฐธ์กฐ:
  • ๋Ÿฐํƒ€์ž„: ๋Œ€์นญ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ JavaScript ์˜จ๋ผ์ธ ์ œ์ถœ์˜ 96.46%๋ณด๋‹ค 63ms ๋น ๋ฆ„
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰: 55.6MB, ๋Œ€์นญ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ JavaScript ์˜จ๋ผ์ธ ์ œ์ถœ์˜ 44.80% ๋ฏธ๋งŒ




  • ํ•ด๊ฒฐ์ฑ…




    var isSymmetric = function (left_tree, right_tree = left_tree) {
    
        /* -------------------------------------------------------------------------- */
        /*                             101. Symmetric Tree                            */
        /* -------------------------------------------------------------------------- */
    
        /**
         * @author  Samuel Hinchliffe
         * @see    {@link linkedin.com/in/samuel-hinchliffe-๐Ÿš€-2bb5801a5/ | Author's Linkedin }
         * @see    {@link github.com/Samuel-Hinchliffe}
        */
    
         // https://leetcode.com/submissions/detail/684314946/
    
        // Both are trees are the same
        if (!left_tree && !right_tree) {
            return true;
        }
    
        // One exists without another?
        if (!left_tree || !right_tree) {
            return false;
        }
    
        // Are left and right of same value?
        // If not return false
        if (left_tree.val != right_tree.val) {
            return false;
        }
    
        // Do all the left trees and right trees
        let outer_tree = isSymmetric(left_tree.left,  right_tree.right);
        let inner_tree = isSymmetric(left_tree.right, right_tree.left);
    
        // Are both trees the same?
        return outer_tree && inner_tree;
    };
    
    
    

    ์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ