עבור לתוכן

++C עצים בינארים

Featured Replies

פורסם
  • מחבר

המחשב לא מוכן לקבל את הפקודה

 current->left=current->right;

(ניסתי לעשות את temp מסוג מצביע, וגם זה לא עובד! )

  • תגובות 35
  • צפיות 4k
  • נוצר
  • תגובה אחרונה
פורסם

מה השגיאה שאתה מקבלת?

ניסית לרשום כך(?):


template <class T>
void Tree<T>::reflect(Node<T> *current)
{
if(current)
{
Node<T> *temp;
temp=current->left;
current->left=current->right;
current->right=temp;
reflect(current->left);
reflect(current->right);
}
}


את ההשמה של השמאלי בTEMP הוא נותן לך?

פורסם
  • מחבר

עברתי על התכנית שלך!, המחשב אפילו לא נכנס ל if.

אז עשיתי כזה דבר:


template <class T>
void Tree<T>::reflect(Node<T> *current)
{
if(current)
{
Node<T> *temp;
temp=current->left;
current->left=current->right;
current->right=temp;

}
reflect(current->left);
reflect(current->right);
}

וזו השגיאה שהוא נותן:

An unhandled exception of type 'System.NullReferenceException' occurred in NAAMA.exe

Additional information: Object reference not set to an instance of an object.

פורסם
  • מחבר

ו-לא. הוא לא נותן לי להציב בtemp את ההודעה הנ"ל הוא נותן על השורה הזו: temp=current->left;

פורסם

ניסית לשלוח לו את הצומת ממנה את רוצה להחליף?(בדרך כלל השורש).

כנראה את שולחת NULL, ולא את הצומת.

פורסם

את יכולה להראות את הקריאה (החיצונית) לפונקציה?

פורסם
  • מחבר

איך קוראים שוב לפונקציה, ושלחים אליה את הצומת ולא את NULL???

הקריאה לפונקציה: t.reflect();

זו המחלקה Tree:


template <class T>
class Tree
{
protected:
Node<T> * root;

public:

Tree();
~Tree();

int IsEmpty() const;
void Clear() { Clear(root); root=NULL;}
void PreOrder() { PreOrder(root); }
void InOrder() { InOrder(root); }
void PostOrder() { PostOrder(root); }
virtual void Process(T val) {cout<<val<<" ";}

int leaves(){ return leaves(root); }//פונקציה המחזירה את מספר העלים בעץ
int height(){ return height(root); }//פונקציה המחזירה את גובה העץ
void reflect(){ reflect(root); }//פונקציה המחליפה בין בנים של כל קוקוד בעץ

private:
void Clear(Node<T>*current);
void PreOrder(Node<T>*current);
void InOrder(Node<T>*current);
void PostOrder(Node<T>*current);

int leaves(Node<T>*current);
int height(Node<T>*current);
void reflect(Node<T>*current);
};

פורסם

את הקריאות לבנים את צריכה לעשות רק אם הנוכחי הוא לא NULL.

אם current הוא NULL, את לא יכולה לגשת ל- current->right ו- current->left.

פורסם
  • מחבר

לאור עצותיכם המרובות, זה מה שכתבתי:

מישו יכול להגיד לי אם זה נכון?????

תודה. :hi:


void Tree<T>::reflect(Node<T>*current)
{
if(current)
{
Node<T>*temp;
temp=current->left;
current->left=current->right;
current->right=temp;
}
if(current)
{
reflect(current->left);
reflect(current->right);
}
}

פורסם

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

פורסם
  • מחבר

כן. התנאי הכפול זה בטעות.

אבל-

פתאום גיילתי שאני צריכה להחליף בין ערכי הבנים!!!!!!!!!

ולא בין הבנים עצמם(אני החלפתי בין תת עץ ימני לשמאלי וכו')

יש פתרון??????????????????????????? :'(

פורסם

ומה קורה אם יש רק בן אחד?

פורסם
  • מחבר

אם זה רק בן אחד- אז לא.

אבל- איך עושים קראיה רקורסיבית (אני מצליחה להחליף רק בין זוג הבנים הראשון ואז הפונקציה נגמרת לי.)

זה מה שכתבתי:


emplate <class T>
void Tree<T>::reflect(Node<T>*current)
{
if((current->left==NULL)||(current->right==NULL))
{}
else
{
T temp;
temp=current->left->value;
current->left->value=current->right->value;
current->right->value=temp;
if((current->left->left!=NULL)&&(current->left->right!=NULL))
{
reflect(current->left);
}
if((current->right->right!=NULL)&&(current->right->right!=NULL))
{
reflect(current->right);
}
}
}

פורסם

תנסי:

template <class T>
void Tree<T>::reflect(Node<T>*current)
{
if(current)
{
if(current->right && current->left)
{
T temp;
temp=current->left->value;
current->left->value=current->right->value;
current->right->value=temp;
}

reflect(current->left);
reflect(current->right);
}
}

פורסם
  • מחבר

תודה אבל לא. זה מחליף רק פעם אחת בין הבנים, ולא קורא שוב לפונקציה ברקורסיה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים