voidNBInOrder(Tree T){
Tree stack[MAX], p;int top =-1;if(!T)return;
p = T;while(p||top!=-1)//{while(p)//注意判断条件,p不能为空{
stack[++top]= p;//第一次访问,入栈
p = p->lchild;//遍历左子树}if(top >-1){
p = stack[top--];printf("%d ", p->data);
p = p->rchild;}}}
voidBNPostOrder(Tree T){
Tree stack[MAX], p;int top =-1, check[MAX]={0};if(!T)return;
p = T;//别忘给p赋初值while(p || top !=-1){while(p){
stack[++top]= p;//第一次访问,入栈
check[top]=1;//第一次访问后置为一
p = p->lchild;//遍历左子树}if(top >-1){if(check[top]==1)//若该结点访问过一次,则进行第二次访问{
p = stack[top];
check[top]=2;//第二次访问该结点
p = p->rchild;}else{
p = stack[top--];//第三次访问该结点,出栈printf("%d ", p->data);
p =NULL;//将指针p置为空,以便可以继续回返}}}}
4.层次遍历
voidLevelOrder(Tree T){
Tree queue[N];int rear =0, front =-1;if(!T)return;
queue[rear]= T;while(front != rear)//当队列非空时{printf("%d ", queue[++front]->data);//出队列,访问队首结点的数据域if(queue[front]->lchild)queue[++rear]= queue[front]->lchild;//将队首结点的左孩子入队列if(queue[front]->rchild)queue[++rear]= queue[front]->rchild;//将队首结点的右孩子入队列}}