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

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 ;
}

转载于:https://www.cnblogs.com/chio/archive/2007/10/23/934345.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值