非递归打印二叉树的所有路径

google面试题:

#include <iostream>
#include 
<vector>
#include 
<cstdlib>
using namespace std;


struct Node
{
    
char data;
    Node 
* left;
    Node 
* right;
};

enum Tag{goLeft, goRight, goBack };

/* 打印从根到叶子结点之路径 */
void PrintPath( const vector<Node *> & v )
{
    vector
< Node *>::const_iterator vi;
    
for( vi = v.begin(); vi!=v.end(); ++vi )
    {
        Node 
* n = reinterpret_cast< Node *>(*vi);
        cout
<< n->data<< " ";
    }
    cout
<< endl;
}

void PrintAllPaths(Node *root)
{
    assert(root 
!= NULL);

    vector
<Node *> vec_node;
    vector
<Tag> vec_flag;
    
//init
    vec_node.push_back(root);
    vec_flag.push_back(goLeft);

    
while!vec_node.empty())
    {
        Node 
*curNode = vec_node.back();
        Tag curFlag 
= vec_flag.back();


        
switch(curFlag)
        {
            
case goLeft:
                vec_flag.pop_back();
                vec_flag.push_back(goRight);

                
if(curNode->left != NULL)
                {
                    vec_node.push_back(curNode
->left);
                    vec_flag.push_back(goLeft);
                }
                
break;

            
case goRight:
                vec_flag.pop_back();
                vec_flag.push_back(goBack);

                
if(curNode->right != NULL)
                {
                    vec_node.push_back(curNode
->right);
                    vec_flag.push_back(goLeft);
                }

                
break;


            
case goBack:
                
if(NULL == curNode->left && NULL == curNode->right)
                    PrintPath(vec_node);

                vec_flag.pop_back();
                vec_node.pop_back();
                
break;

            
default:
                
break;
        }
//switch-end
    }//while-end
}

int main()
{
    Node root, b, c, d, e, f, g, h;
    root.data
='a';
    root.left
=&b;
    root.right
=&e;

    b.data
='b';
    b.left
=&c;
    b.right
=&d;

    c.data
='c';
    c.left
=NULL;
    c.right
=NULL;

    d.data
='d';
    d.left
=NULL;
    d.right
=NULL;

    e.data
='e';
    e.left
=&f;
    e.right
=&g;

    f.data
='f';
    f.left
=NULL;
    f.right
=NULL;

    g.data
='g';
    g.left
=NULL;
    g.right
=&h;

    h.data
='h';
    h.left
=NULL;
    h.right
=NULL;


    PrintAllPaths(
&root);

    system(
"PAUSE");
    
return 0;
}

posted @ 2007-10-23 12:50  中土  阅读(1963)  评论(0编辑  收藏  举报
©2005-2008 Suprasoft Inc., All right reserved.