2015-11-07 6 views
0
C++

Binary Tree - Imprimer branches gauche uniquement - Utiliser Postorder Traverse -

Salut! Je voudrais savoir ce que peut être la condition de l'instruction if, de sorte que toutes les branches restantes d'un arbre binaire puissent être imprimées en utilisant une traversée d'ordre.

template <class dataType> 
void PrintLeft (BinaryTree <dataType> * bt) { 

if (!(bt == NULL)) 

{ 

    //traverse left child 

    PrintLeft (bt->left()); 

    //traverse right child 

    PrintLeft (bt->right()); 

    //visit tree 

    if(/*no idea what goes here*/) 

    cout << bt->getData() <<"\t"; 

} 

} 
+1

Êtes-vous sûr d'avoir besoin 'si()' déclaration du tout? –

+0

Oui. Je ne veux pas imprimer tout l'arbre binaire. Seulement besoin d'imprimer les branches de gauche. –

+0

Donc, à partir du pointeur 'bt' vous ne pouvez pas décider si c'est un noeud gauche ou droit. Vous devez ajouter un autre paramètre 'bool' à la fonction et lui indiquer lors de l'appel. –

Répondre

1

Code va ici pour postorder traversant

void postorder(BinaryTree *bt) 
{ 
    if(bt!=NULL) 
    { 
     postorder(t->lp); 
     postorder(t->rp); 
     //No Code Goes Here 
     cout<<bt->data<<"\t"; 
    } 
} 
+0

Merci pour votre réponse, mais je ne veux pas imprimer tout l'arbre binaire. Seulement besoin d'imprimer les branches de gauche. Une idée comment? –

0

Try This One

void leftViewUtil(struct node *root, int level, int *max_level) 
{ 
    // Base Case 
    if (root==NULL) return; 

    // If this is the first node of its level 
    if (*max_level < level) 
    { 
     printf("%d\t", root->data); 
     *max_level = level; 
    } 

    // Recur for left and right subtrees 
    leftViewUtil(root->left, level+1, max_level); 
    leftViewUtil(root->right, level+1, max_level); 
} 

// A wrapper over leftViewUtil() 
void leftView(struct node *root) 
{ 
    int max_level = 0; 
    leftViewUtil(root, 1, &max_level); 
} 

// Driver Program to test above functions 
int main() 
{ 
    struct node *root = newNode(12); 
    root->left = newNode(10); 
    root->right = newNode(30); 
    root->right->left = newNode(25); 
    root->right->right = newNode(40); 

    leftView(root); 

    return 0; 
} 
+1

Avez-vous lu le commentaire [OPs] (http://stackoverflow.com/questions/33581372/binary-tree-print-left-branches-only-using-postorder-traverse-c#comment54939694_33581372)? –

+0

oui j'ai lu – jagdish

+0

Aussi, OP marqué cette question [tag: C++]. – Zereges

1

Je comprends que vous voulez visiter uniquement les nœuds qui ont été vus à partir d'une branche gauche. Puisque c'est postorder, vous devez les visiter quand vous revenez sur la bonne branche. Ainsi, comme dit par πάντα ῥεῖ, vous pouvez utiliser un drapeau booléen indiquant à partir de quel type de branche vous avez découvert le noeud.

Ainsi, une voie possible serait la suivante:

using Node = BinaryTree <int>; // or another type supporting << operator 

void printLeft(Node * root, bool from_left) 
{ 
    if (root == nullptr) // empty tree? 
    return; 

    printLeft(root->left, true); // this node must be visited in postorder 
    printLeft(root->right, false); // this one must not be visited in postorder 

    if (from_left) // was root seen from a left arc? 
    cout << root->getData() << "\t"; // visit only if was seen from a left branch 
} 

Il y a une ambiguïté avec la racine. Je suppose qu'il ne doit pas être imprimé parce qu'il n'est pas atteint à partir d'une branche gauche (ni à droite aussi).

Ainsi, le premier appel devrait être:

printLeft(root, false); 

Tout comme la vérification, pour cet arbre:

enter image description here

L'algorithme produit comme postorder gauche traversal la séquence suivante

0 1 4 3 8 9 12 11 16 18

0
if(!bt->left()==NULL) 
    cout << bt->left()->getData() << "\t";