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