创建:先序输入,空格代表结点为空。
递归遍历:中序遍历。
非递归思路:对于每个结点,有且只有一次应用函数操作的机会,所以操作之后就出栈。具体为:结点不为空就读取左孩子,直到左孩子为空;栈顶结点出栈,对出栈的结点应用函数操作;查看出栈结点的右孩子。
#include<stdio.h>#include<stdlib.h>typedef struct BiTNode{char data;//数据struct BiTNode *lchild;//左孩子struct BiTNode *rchild;//右孩子}BiTNode,*BiTree;typedef struct Stack{BiTNode *base;//栈底BiTNode *top;//栈顶}Stack;void PrintElement(char e);//打印函数char *CreateBiTree(char *p,BiTree &T);//依次输入二叉树的值,空格表示空void PreOrderTraverse1(BiTree T,void (*Visit)(char e));//递归遍历void PreOrderTraverse2(BiTree T,void (*Visit)(char e));//非递归遍历①int main(){BiTree T=NULL;char *p;p=CreateBiTree("abc d ef g ",T);PreOrderTraverse1(T,PrintElement);putchar('\n');PreOrderTraverse2(T,PrintElement);putchar('\n');return 0;}void PrintElement(char e){printf("%c ",e);return;}char *CreateBiTree(char *p,BiTree &T){char ch=*p;p++;if(ch==' ') T=NULL;else{T=(BiTree)malloc(sizeof(BiTNode));if(T==NULL) exit(0);T->data=ch;p=CreateBiTree(p,T->lchild);p=CreateBiTree(p,T->rchild);}return p;}void PreOrderTraverse1(BiTree T,void (*Visit)(char e)){if(T!=NULL){PreOrderTraverse1(T->lchild,Visit);Visit(T->data);PreOrderTraverse1(T->rchild,Visit);return;}else return;}void PreOrderTraverse2(BiTree T,void (*Visit)(char e)){Stack S;BiTNode *p;S.base=(BiTNode *)malloc(20*sizeof(BiTNode));S.top=S.base;p=T;while(1){if(p!=NULL) {*S.top=*p; S.top++; while(p->lchild!=NULL){
*S.top=*(p->lchild); S.top++; p=S.top-1;}}S.top--;if(S.base==S.top) break;Visit(S.top->data);p=S.top->rchild;}free(S.base);return;}
get非递归里面:
*S.top=*p与S.top=p的效果不一样;
指针变量才能用->,而且得malloc(有具体地址指向),非指针用“.”(属性)。
指针变量才能用->,而且得malloc(有具体地址指向),非指针用“.”(属性)。