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

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

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

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

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

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

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

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

        מעבר על עץ

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

        ל תגובה 1 תגובה אחרונה
        0
        • ל מנותק
          ל מנותק
          ליה
          השיב לchagold ב נערך לאחרונה על ידי
          #4

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

          yossizY OdedDvirO 2 תגובות תגובה אחרונה
          0
          • yossizY מנותק
            yossizY מנותק
            yossiz
            השיב לליה ב נערך לאחרונה על ידי
            #5

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

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            ל תגובה 1 תגובה אחרונה
            2
            • 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
              • ל מנותק
                ל מנותק
                ליה
                השיב לyossiz ב נערך לאחרונה על ידי
                #7

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

                chagoldC תגובה 1 תגובה אחרונה
                0
                • chagoldC מנותק
                  chagoldC מנותק
                  chagold
                  השיב לליה ב נערך לאחרונה על ידי
                  #8

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

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

                  באיזה שפה?

                  ל תגובה 1 תגובה אחרונה
                  0
                  • ל מנותק
                    ל מנותק
                    ליה
                    השיב ל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 מנותק
                        dovidD מנותק
                        dovid ניהול
                        השיב ל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
                        • yossizY מנותק
                          yossizY מנותק
                          yossiz
                          השיב לdovid ב נערך לאחרונה על ידי
                          #12

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

                          הערה קטנה:

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

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

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

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

                          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                          dovidD תגובה 1 תגובה אחרונה
                          5
                          • dovidD מנותק
                            dovidD מנותק
                            dovid ניהול
                            השיב לyossiz ב נערך לאחרונה על ידי dovid
                            #13

                            @yossiz תודה!

                            if(v && !v.passLoop)
                            

                            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                            בכל נושא אפשר ליצור קשר dovid@tchumim.com

                            תגובה 1 תגובה אחרונה
                            5
                            • ל מנותק
                              ל מנותק
                              ליה
                              השיב לdovid ב נערך לאחרונה על ידי
                              #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
                              • ל מנותק
                                ל מנותק
                                ליה
                                השיב לליה ב נערך לאחרונה על ידי
                                #15

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

                                chagoldC dovidD 2 תגובות תגובה אחרונה
                                0
                                • chagoldC מנותק
                                  chagoldC מנותק
                                  chagold
                                  השיב לליה ב נערך לאחרונה על ידי chagold
                                  #16

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

                                  תגובה 1 תגובה אחרונה
                                  0
                                  • dovidD מנותק
                                    dovidD מנותק
                                    dovid ניהול
                                    השיב לליה ב נערך לאחרונה על ידי
                                    #17

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

                                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                    תגובה 1 תגובה אחרונה
                                    0

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

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

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