Προς το περιεχόμενο

Θα δουλεύει πάντα η όχι;


ΠάρηςΓ

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας παίδες... Δε θέλω να σας ζαλίσω και μπορει να μη σας ενδιαφέρει αυτο το θέμα τόσο...

Εχω γραψει κώδικα ωστε να κάνει ενδοδιατεταγμένη διαταξη σε ενα δέντρο.

Οπως ξερετε η κλασική λύση με αναδρομή ειναι

 

inorder(node)

{

inorder(leftnode)

visit()

gorigth(rightnode)

}

 

Όμως επρεπε να το υλοποιήσω χωρις αναδρομή..Σιγουρα υπάρχουν πολλοί τροποι....

Αλλα να σημειώσω οτι για βοηθεια εχω οτι το δεντρο ειναι Threaded..Δηλαδή οι κομβοι που δεν εχουν αλλο κομβο δεξια δειχνουν στον αμέσως επόμενο συμφωνα με την ενδοδιατεταγμένη διαταξη.

ΦΩΤΟ

330px-Threaded_tree.svg.png

 

Οπου και αν εψαξα δεν βρηκα κωδικα να υλοποιει τη λύση χωρις καποια βοηθητική λίστα (stack ) κτλ...

Ομως εγω το εκανα απλα με μια μεταβλητη bool.

 

>	void ThreadedBTree<int>::output()
{
	bool BLOCK=false,visited=false;
	ThreadedBTreeNode<int> *p=root;

	while(true)
	{              [b]ΠΑΜΕ ΑΡΙΣΤΕΡΑ ΜΕΧΡΙ ΟΣΟ ΠΑΕΙ[/b]
		while(p->leftChild && !BLOCK)
		{
			p=p->leftChild;
		}
                                               ΜΕΤΑ ΔΕΙΞΕ ΤΟ ΣΤΟΙΧΕΙΟ
		std::cout << p->data << " ";
		if(p==root) visited=true;
                                               ΕΔΩ ΕΑΝ ΜΑΣ ΠΑΕΙ ΠΙΣΩ ΘΕΤΟΥΜΕ BLOCK=true
ΩΣΤΕ ΝΑ ΜΗΝ ΚΟΙΤΑΞΟΥΜΕ ΠΑΛΙ ΑΡΙΣΤΕΡΑ ΑΦΟΥ ΘΑ ΓΥΡΙΖΟΥΜΕ
		if(p->thread==true) BLOCK=true;
		else BLOCK=false;
			
		p=p->rightChild;			
		[b]ΕΔΩ ΕΛΕΓΧΟΙ ΓΙΑ ΤΟ ΠΟΤΕ ΠΡΕΠΕΙ ΝΑ ΣΤΑΜΑΤΙΣΟΥΜΕ	[/b]		
		if(p==root && p->rightChild==root)
		{
			std::cout << p->data << " ";
			return;
		}
		else if(p==root)
		{
			BLOCK=false;
			if(visited) return;
		    std::cout << p->data << " ";
			p=p->rightChild;
			visited=true;
		}

	}
}

 

Ο κωδικας δουλεύει απλα δεν ξερω εαν δε δουλέψει σε καποια περιπτωση..Οποιος μπορει ας HELP και ευχαριστώ..

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...