דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. אפשר בבקשה קוד של מעבר על עץ *לא* בינארי

אפשר בבקשה קוד של מעבר על עץ *לא* בינארי

מתוזמן נעוץ נעול הועבר תכנות
17 פוסטים 6 כותבים 765 צפיות 3 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ל ליה

    חיפשתי שעות מעבר על עץ לא בינארי
    ואני לא מוצאת, יש רק מעבר על עץ בינארי
    אפשר בבקשה עזרה
    תודה

    צבי-שצ
    צבי-שצ
    צבי-ש
    כתב ב נערך לאחרונה על ידי
    #2
    פוסט זה נמחק!
    תגובה 1 תגובה אחרונה
    0
    • ל ליה

      חיפשתי שעות מעבר על עץ לא בינארי
      ואני לא מוצאת, יש רק מעבר על עץ בינארי
      אפשר בבקשה עזרה
      תודה

      chagoldC
      chagoldC
      chagold
      כתב ב נערך לאחרונה על ידי chagold
      #3

      @ליה כתב באפשר בבקשה קוד של מעבר על עץ *לא* בינארי:

      מעבר על עץ

      https://algoritmim.co.il/interview-practice/how-to-do-a-tree-walk/
      (בהתחשב בכתוב)

      ל תגובה 1 תגובה אחרונה
      0
      • chagoldC chagold

        @ליה כתב באפשר בבקשה קוד של מעבר על עץ *לא* בינארי:

        מעבר על עץ

        https://algoritmim.co.il/interview-practice/how-to-do-a-tree-walk/
        (בהתחשב בכתוב)

        ל
        ל
        ליה
        כתב ב נערך לאחרונה על ידי
        #4

        @chagold אין שם קוד לעץ לא בינארי

        yossizY OdedDvirO 2 תגובות תגובה אחרונה
        0
        • ל ליה

          @chagold אין שם קוד לעץ לא בינארי

          yossizY
          yossizY
          yossiz
          כתב ב נערך לאחרונה על ידי
          #5

          @ליה לא מספיק להגיד מה העץ לא
          תסביר לנו קצת על מה העץ כן
          ומה אתה רוצה להשיג עם הקוד

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה
          👈 רוצים כתובת מייל בעברית? כנסו למייל.קום 👉

          ל תגובה 1 תגובה אחרונה
          2
          • ל ליה

            @chagold אין שם קוד לעץ לא בינארי

            OdedDvirO
            OdedDvirO
            OdedDvir
            כתב ב נערך לאחרונה על ידי
            #6

            @ליה בעץ לא בינארי, מספר הצאצאים שיוצאים מכל צומת יכול להיות גדול מ-2. דרך אחת לאחסן את ההפניות לצאצאים הוא ע"י מערך, לכן צריך לסרוק את כל הצמתים במערך.
            לדוגמא (#C):

            public class Node {
               public string Value {get; set;}
               public Node[] Nodes {get; set;}
            }
            // ...
            public void traverseNode(Node root) {
               Console.Writeline(root.Value); // print node's value
               foreach (Node n in root.Nodes) {
                  traverseNode(n);
                }
            }
            
            תגובה 1 תגובה אחרונה
            1
            • yossizY yossiz

              @ליה לא מספיק להגיד מה העץ לא
              תסביר לנו קצת על מה העץ כן
              ומה אתה רוצה להשיג עם הקוד

              ל
              ל
              ליה
              כתב ב נערך לאחרונה על ידי
              #7

              @yossiz אני מנסה שעות לרוץ על מערך של אובייקטים,
              שגם האובייקטים מכילים אובייקטים, לא ידוע אם לאובייקט כן יש ילדים או אין או כמה
              וחשבתי על האופציה של לסרוק כמו עץ רגיל.
              רק שהתסבכתי ואולי בכלל יש דרך לסרוק את המערך לא כמו עץ?

              chagoldC תגובה 1 תגובה אחרונה
              0
              • ל ליה

                @yossiz אני מנסה שעות לרוץ על מערך של אובייקטים,
                שגם האובייקטים מכילים אובייקטים, לא ידוע אם לאובייקט כן יש ילדים או אין או כמה
                וחשבתי על האופציה של לסרוק כמו עץ רגיל.
                רק שהתסבכתי ואולי בכלל יש דרך לסרוק את המערך לא כמו עץ?

                chagoldC
                chagoldC
                chagold
                כתב ב נערך לאחרונה על ידי
                #8

                @ליה כתב באפשר בבקשה קוד של מעבר על עץ *לא* בינארי:

                רק שהתסבכתי ואולי בכלל יש דרך לסרוק את המערך לא כמו עץ

                באיזה שפה?

                ל תגובה 1 תגובה אחרונה
                0
                • chagoldC chagold

                  @ליה כתב באפשר בבקשה קוד של מעבר על עץ *לא* בינארי:

                  רק שהתסבכתי ואולי בכלל יש דרך לסרוק את המערך לא כמו עץ

                  באיזה שפה?

                  ל
                  ל
                  ליה
                  כתב ב נערך לאחרונה על ידי
                  #9

                  @chagold JS תודה

                  תגובה 1 תגובה אחרונה
                  0
                  • dovidD
                    dovidD
                    dovid
                    ניהול
                    כתב ב נערך לאחרונה על ידי dovid
                    #10

                    @ליה מעבר על מאפייני אובייקט נעשה בעזרת Object.keys שנותן את שמות המפתחות, או לולאת for .. in שנותנת גם את שמות המפתחות, או מתודת Object.entries שמחזירה אוסף של זוגות מפתח-ערך, ועוד.
                    לשםמעבר עמוק, כלומר שבכל מפתח בודקים את הערך ואם הוא אובייקט יורדים גם לרמה שלו, אפשר להשתמש ברקורסיה. הנה דוגמה:

                         function iterateDeep(obj)
                         { 
                           if (Object(obj) === obj)
                             for (const [k, v] of Object.entries(obj))
                               iterateDeep(v);
                           else
                             console.log("item: " + obj);
                         }
                    

                    הפונקציה הזו בודקת קודם אם הערך הוא אובייקט או משהו אחר, אם זה אובייקט היא עוברת על הערכים של הצאצאים (מאפיינים בנים בלבד) וקוראת עבור כל ערך לפונקציה הזו בעצמה. אם הצאצא הוא אובייקט העבודה תחזור על עצמה.
                    בכזו פונקציה יש בעיה של אינסופיות, כי לאובייקט יכול להיות חבר למשל שמצביע על על עצמו, או על אביו/אחיו, ואז יהיה מעגל אינסופי. בשביל למנוע את זה אפשר להוסיף דגל בתוך האובייקט במהלך המעבר:

                      if (Object(obj) === obj) {
                        for (const [k, v] of Object.entries(obj))
                          if(!v.passLoop){
                             iterateDeep(v, [...keys, k]); 
                             v.passLoop = true;
                          }
                      } else
                         console.log("item: " + obj);
                        
                    

                    אם רוצים לדעת בכל ערך את הנתיב בו הוא נמצא ביחס לאובייקט, אפשר להעביר את המפתח הנוכחי כפרמטר במערך, ואז לשרשר אותם:

                    function iterateDeep(obj, keys = [])
                    { 
                      if (Object(obj) === obj) {
                        for (const [k, v] of Object.entries(obj))
                          if(!v.passLoop){
                             iterateDeep(v, [...keys, k]); 
                             v.passLoop = true;
                          }
                      } else
                        console.log(`${keys.join('.')}: ${obj}`);
                    }
                    
                    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                    dovidD ל 2 תגובות תגובה אחרונה
                    8
                    • dovidD dovid

                      @ליה מעבר על מאפייני אובייקט נעשה בעזרת Object.keys שנותן את שמות המפתחות, או לולאת for .. in שנותנת גם את שמות המפתחות, או מתודת Object.entries שמחזירה אוסף של זוגות מפתח-ערך, ועוד.
                      לשםמעבר עמוק, כלומר שבכל מפתח בודקים את הערך ואם הוא אובייקט יורדים גם לרמה שלו, אפשר להשתמש ברקורסיה. הנה דוגמה:

                           function iterateDeep(obj)
                           { 
                             if (Object(obj) === obj)
                               for (const [k, v] of Object.entries(obj))
                                 iterateDeep(v);
                             else
                               console.log("item: " + obj);
                           }
                      

                      הפונקציה הזו בודקת קודם אם הערך הוא אובייקט או משהו אחר, אם זה אובייקט היא עוברת על הערכים של הצאצאים (מאפיינים בנים בלבד) וקוראת עבור כל ערך לפונקציה הזו בעצמה. אם הצאצא הוא אובייקט העבודה תחזור על עצמה.
                      בכזו פונקציה יש בעיה של אינסופיות, כי לאובייקט יכול להיות חבר למשל שמצביע על על עצמו, או על אביו/אחיו, ואז יהיה מעגל אינסופי. בשביל למנוע את זה אפשר להוסיף דגל בתוך האובייקט במהלך המעבר:

                        if (Object(obj) === obj) {
                          for (const [k, v] of Object.entries(obj))
                            if(!v.passLoop){
                               iterateDeep(v, [...keys, k]); 
                               v.passLoop = true;
                            }
                        } else
                           console.log("item: " + obj);
                          
                      

                      אם רוצים לדעת בכל ערך את הנתיב בו הוא נמצא ביחס לאובייקט, אפשר להעביר את המפתח הנוכחי כפרמטר במערך, ואז לשרשר אותם:

                      function iterateDeep(obj, keys = [])
                      { 
                        if (Object(obj) === obj) {
                          for (const [k, v] of Object.entries(obj))
                            if(!v.passLoop){
                               iterateDeep(v, [...keys, k]); 
                               v.passLoop = true;
                            }
                        } else
                          console.log(`${keys.join('.')}: ${obj}`);
                      }
                      
                      dovidD
                      dovidD
                      dovid
                      ניהול
                      כתב ב נערך לאחרונה על ידי
                      #11

                      בגירסת גנרטור (הלולאה מתקדמת רק על פי בקשה של for ..of)

                      function* iterateDeep(obj, keys = [])
                      { 
                        if (Object(obj) === obj) {
                          for (const [k, v] of Object.entries(obj))
                            if(!v.passLoop){
                               yield* iterateDeep(v, [...keys, k]); 
                               v.passLoop = true;
                            }
                        } else
                          yield [keys.join('.'), obj];
                      }
                      
                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                      yossizY תגובה 1 תגובה אחרונה
                      6
                      • dovidD dovid

                        בגירסת גנרטור (הלולאה מתקדמת רק על פי בקשה של for ..of)

                        function* iterateDeep(obj, keys = [])
                        { 
                          if (Object(obj) === obj) {
                            for (const [k, v] of Object.entries(obj))
                              if(!v.passLoop){
                                 yield* iterateDeep(v, [...keys, k]); 
                                 v.passLoop = true;
                              }
                          } else
                            yield [keys.join('.'), obj];
                        }
                        
                        yossizY
                        yossizY
                        yossiz
                        כתב ב נערך לאחרונה על ידי
                        #12

                        @dovid תודה! למדתי כמה דברים שלא הכרתי מהתשובה!

                        הערה קטנה:

                        if(!v.passLoop){
                        ... 
                        v.passLoop = true;
                        

                        שורות אלו נכשלים במקרה ש-v הוא null
                        אולי אפשר לתקן כך:

                        if(!v?.passLoop){
                        ...
                        if (v) v.passLoop = true;
                        

                        או שיש צורה יותר אלגנטית

                        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה
                        👈 רוצים כתובת מייל בעברית? כנסו למייל.קום 👉

                        dovidD תגובה 1 תגובה אחרונה
                        5
                        • yossizY yossiz

                          @dovid תודה! למדתי כמה דברים שלא הכרתי מהתשובה!

                          הערה קטנה:

                          if(!v.passLoop){
                          ... 
                          v.passLoop = true;
                          

                          שורות אלו נכשלים במקרה ש-v הוא null
                          אולי אפשר לתקן כך:

                          if(!v?.passLoop){
                          ...
                          if (v) v.passLoop = true;
                          

                          או שיש צורה יותר אלגנטית

                          dovidD
                          dovidD
                          dovid
                          ניהול
                          כתב ב נערך לאחרונה על ידי dovid
                          #13

                          @yossiz תודה!

                          if(v && !v.passLoop)
                          
                          • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                          • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                          תגובה 1 תגובה אחרונה
                          5
                          • dovidD dovid

                            @ליה מעבר על מאפייני אובייקט נעשה בעזרת Object.keys שנותן את שמות המפתחות, או לולאת for .. in שנותנת גם את שמות המפתחות, או מתודת Object.entries שמחזירה אוסף של זוגות מפתח-ערך, ועוד.
                            לשםמעבר עמוק, כלומר שבכל מפתח בודקים את הערך ואם הוא אובייקט יורדים גם לרמה שלו, אפשר להשתמש ברקורסיה. הנה דוגמה:

                                 function iterateDeep(obj)
                                 { 
                                   if (Object(obj) === obj)
                                     for (const [k, v] of Object.entries(obj))
                                       iterateDeep(v);
                                   else
                                     console.log("item: " + obj);
                                 }
                            

                            הפונקציה הזו בודקת קודם אם הערך הוא אובייקט או משהו אחר, אם זה אובייקט היא עוברת על הערכים של הצאצאים (מאפיינים בנים בלבד) וקוראת עבור כל ערך לפונקציה הזו בעצמה. אם הצאצא הוא אובייקט העבודה תחזור על עצמה.
                            בכזו פונקציה יש בעיה של אינסופיות, כי לאובייקט יכול להיות חבר למשל שמצביע על על עצמו, או על אביו/אחיו, ואז יהיה מעגל אינסופי. בשביל למנוע את זה אפשר להוסיף דגל בתוך האובייקט במהלך המעבר:

                              if (Object(obj) === obj) {
                                for (const [k, v] of Object.entries(obj))
                                  if(!v.passLoop){
                                     iterateDeep(v, [...keys, k]); 
                                     v.passLoop = true;
                                  }
                              } else
                                 console.log("item: " + obj);
                                
                            

                            אם רוצים לדעת בכל ערך את הנתיב בו הוא נמצא ביחס לאובייקט, אפשר להעביר את המפתח הנוכחי כפרמטר במערך, ואז לשרשר אותם:

                            function iterateDeep(obj, keys = [])
                            { 
                              if (Object(obj) === obj) {
                                for (const [k, v] of Object.entries(obj))
                                  if(!v.passLoop){
                                     iterateDeep(v, [...keys, k]); 
                                     v.passLoop = true;
                                  }
                              } else
                                console.log(`${keys.join('.')}: ${obj}`);
                            }
                            
                            ל
                            ל
                            ליה
                            כתב ב נערך לאחרונה על ידי
                            #14

                            @dovid היי עדיין לא הסתדרתי ואני מרגישה שאני מתפוצצת. אני לא מבינה מה אני מפספסת

                            המערך שלי כולו מכיל אובייקטים, שחלקם מכילים בתוכם גם אובייקטים:

                            זה המערך:

                            [
                              {
                                "id": "1",
                                "name": "sara",
                                "children": [
                                  {
                                    "id": "2",
                                    "name": "dian"
                                  },
                                  {
                                    "id": "3",
                                    "name": "michael",
                                    "children": [
                                      {
                                        "id": "4",
                                        "name": "dkny"
                                      },
                                      {
                                        "id": "5",
                                        "name": "Anne"
                                      }
                                    ]
                                  }
                            
                                ]
                              },
                              {
                                "id": "6",
                                "name": "Tommy"
                              },
                              {
                                "id": "7",
                                "name": "danken",
                                "children": [
                                  {
                                    "id": "8",
                                    "name": "biria"
                                  }
                                ]
                              }
                            
                            ]
                            

                            תודה על היחס.

                            ל תגובה 1 תגובה אחרונה
                            0
                            • ל ליה

                              @dovid היי עדיין לא הסתדרתי ואני מרגישה שאני מתפוצצת. אני לא מבינה מה אני מפספסת

                              המערך שלי כולו מכיל אובייקטים, שחלקם מכילים בתוכם גם אובייקטים:

                              זה המערך:

                              [
                                {
                                  "id": "1",
                                  "name": "sara",
                                  "children": [
                                    {
                                      "id": "2",
                                      "name": "dian"
                                    },
                                    {
                                      "id": "3",
                                      "name": "michael",
                                      "children": [
                                        {
                                          "id": "4",
                                          "name": "dkny"
                                        },
                                        {
                                          "id": "5",
                                          "name": "Anne"
                                        }
                                      ]
                                    }
                              
                                  ]
                                },
                                {
                                  "id": "6",
                                  "name": "Tommy"
                                },
                                {
                                  "id": "7",
                                  "name": "danken",
                                  "children": [
                                    {
                                      "id": "8",
                                      "name": "biria"
                                    }
                                  ]
                                }
                              
                              ]
                              

                              תודה על היחס.

                              ל
                              ל
                              ליה
                              כתב ב נערך לאחרונה על ידי
                              #15

                              @dovid אני רוצה לעבור עליו ולהדפיס את האבא ובתוכו את הבן ובתוך הבן את הנכד, את התגיות אני עושה בHTML (את זה לפחות אני יודעת חח)
                              תודה רבה

                              chagoldC dovidD 2 תגובות תגובה אחרונה
                              0
                              • ל ליה

                                @dovid אני רוצה לעבור עליו ולהדפיס את האבא ובתוכו את הבן ובתוך הבן את הנכד, את התגיות אני עושה בHTML (את זה לפחות אני יודעת חח)
                                תודה רבה

                                chagoldC
                                chagoldC
                                chagold
                                כתב ב נערך לאחרונה על ידי chagold
                                #16

                                @ליה https://jsfiddle.net/g4tsejc9/

                                תגובה 1 תגובה אחרונה
                                0
                                • ל ליה

                                  @dovid אני רוצה לעבור עליו ולהדפיס את האבא ובתוכו את הבן ובתוך הבן את הנכד, את התגיות אני עושה בHTML (את זה לפחות אני יודעת חח)
                                  תודה רבה

                                  dovidD
                                  dovidD
                                  dovid
                                  ניהול
                                  כתב ב נערך לאחרונה על ידי
                                  #17

                                  @ליה באיזה פרימוורק את משתמשת? אנגולר?

                                  • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                                  • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                                  תגובה 1 תגובה אחרונה
                                  0

                                  שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

                                  נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.

                                  בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

                                  הרשמה התחברות
                                  תגובה
                                  • תגובה כנושא
                                  התחברו כדי לפרסם תגובה
                                  • מהישן לחדש
                                  • מהחדש לישן
                                  • הכי הרבה הצבעות


                                  בא תתחבר לדף היומי!
                                  • התחברות

                                  • אין לך חשבון עדיין? הרשמה

                                  • התחברו או הירשמו כדי לחפש.
                                  • פוסט ראשון
                                    פוסט אחרון
                                  0
                                  • דף הבית
                                  • קטגוריות
                                  • פוסטים אחרונים
                                  • משתמשים
                                  • חיפוש
                                  • חוקי הפורום