2015-11-07 71 views
0

二叉樹 - 打印分支的左部分只有 - 使用後序遍歷 - C++

嗨! 我想知道if語句的條件是什麼,所以二叉樹的所有左分支都可以使用後序遍歷來打印。

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

你確定你所需要的'如果()'聲明呢? –

+0

是的。我不想打印整個二叉樹。只需要打印左側分支。 –

+0

所以從'bt'指針你不能決定它是左或右節點。你需要爲函數添加另一個'bool'參數並在調用時告訴它。 –

回答

1

在這裏不用代碼的後序遍歷

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

感謝您的回答,但我不想打印整個二叉樹。只需要打印左側分支。任何想法如何? –

0

試試這個

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

您是否閱讀過[OP評論](http://stackoverflow.com/questions/33581372/binary-tree-print-left-branches-only-using-postorder-traverse-c#comment54939694_33581372)? –

+0

是的,我收穫了 – jagdish

+0

另外,OP標記了這個問題[tag:C++]。 – Zereges

1

我明白,你要訪問只能從左邊分支中看到的節點。由於它是後序,所以當你回到正確的分支時,你必須訪問它們。所以,比如由πάνταῥεῖ所說的,你可以使用一個布爾標誌來指明你從哪種類型的分支中發現了該節點。

因此,一個可能的方法是如下:

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 
} 

沒有與根的歧義。我認爲它不能被打印,因爲它不是從左分支到達(也不是右)。

所以首先應該聯繫:

printLeft(root, false); 

正如驗證,這棵樹:

enter image description here

的算法產生左序遍歷以下順序

0 1 4 3 8 9 12 11 16 18

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