2015-11-07 42 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";