题目描述:
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