题目描述:
ABC DE G F
A B C D E G F 
C B E G D F A 
C B E G D F A 
求解思路:本题有一个难点和一个坑! 难点是指输入和建树的问题,具体解决方法请看程序;解决完输入,建好树,如何进行遍历,有两种方法:第一种:直接递归(比较简单,不再详述) ; 第二种:手动调用栈(有一点需要注意的地方,请看程序!!)
直接递归遍历的程序如下:
#include<cstdio>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std ;
const int MAXN = 1111111 ;
struct Node
{
    char data ;
    int xu ;
    Node *left ;
    Node *right ;
    Node(): data('\0') , xu(0) , left(NULL) , right(NULL) {} ;
} ;
int flag ;
Node *stap[MAXN] ;
int top ;
void creatTree(Node *&T) // 注意:此处的输入和建树方式
{
    if(flag) return ;
    char tmp ;
    tmp = getchar() ;
    if(tmp == ' ')
    {
        T = NULL ;
    }
    else if(tmp == '\n')
    {
        flag = 1 ;
        return ;
    }
    else
    {
        T = new Node ;
        T -> data = tmp ;
        creatTree(T -> left) ;
        creatTree(T -> right) ;
    }
}
void initV(Node *p)
{
    if(p)
    {
        cout << p -> data << " " ;
        initV(p -> left) ;
        initV(p -> right) ;
    }
}
void midV(Node *p)
{
    if(p)
    {
        midV(p -> left) ;
        cout << p -> data << " " ;
        midV(p -> right) ;
    }
}
int main()
{
    flag = 0 ;
    Node *head ;
    creatTree(head) ;
    initV(head) ;
    cout << endl ;
    midV(head) ;
    cout << endl ;
    midV(head) ;
    cout << endl ;
    return 0 ;
}
#include<cstdio>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std ;
const int MAXN = 1111111 ;
struct Node
{
    char data ;
    int xu ;
    Node *left ;
    Node *right ;
    Node(): data('\0') , xu(0) , left(NULL) , right(NULL) {} ;
} ;
int flag ;
Node *stap[MAXN] ;
int top ;
void creatTree(Node *&T)
{
    if(flag) return ;
    char tmp ;
    tmp = getchar() ;
    if(tmp == ' ')
    {
        T = NULL ;
    }
    else if(tmp == '\n')
    {
        flag = 1 ;
        return ;
    }
    else
    {
        T = new Node ;
        T -> data = tmp ;
        creatTree(T -> left) ;
        creatTree(T -> right) ;
    }
}
void initV(Node *p)
{
    if(p)
    {
        cout << p -> data << " " ;
        initV(p -> left) ;
        initV(p -> right) ;
    }
}
void mid2V(Node *p)
{
    top = -1 ;
    if(p) stap[++ top] = p ;
    Node *tmp ;
    while (top >= 0)
    {
        tmp = stap[top] ;
        while (tmp)
        {
                stap[++ top] = tmp -> left ;
                tmp = tmp -> left ;
        }
        top -- ; // 将空指针退栈
                 // 注意:此处非常重要,空指针退栈意义不只是 上面程序显示的节点的左子树 访问完
                 // 也可能是 下面 所示 的 节点的右子树 访问完 !!
        if(top >= 0)
        {
            tmp = stap[top --] ;
            cout << tmp -> data << " " ;
            stap[++ top] = tmp -> right ;
        }
    }
}
int main()
{
    flag = 0 ;
    Node *head ;
    creatTree(head) ;
    initV(head) ;
    cout << endl ;
    mid2V(head) ;
    cout << endl ;
    mid2V(head) ;
    cout << endl ;
    return 0 ;
}
ACMclub 1757 二叉链表存储的二叉树 - from lanshui_Yang,布布扣,bubuko.com
ACMclub 1757 二叉链表存储的二叉树 - from lanshui_Yang
原文地址:http://blog.csdn.net/lanshui_yang/article/details/38687437