![]()
![]()
#include<stdlib.h>
#include<stdio.h>
#include<stack>
#define N 50
using namespace std;
typedef struct tree{
char ch;
struct tree *lchild;
struct tree *rchild;
}BitTree;
//数组输入
BitTree *CreateTree(int A[], int i, int n){
BitTree *bt;
if(i>n)
return NULL;
else{
bt=(BitTree *)malloc(sizeof(BitTree));
if(A[i]=='#')
return NULL;
bt->ch=A[i];
bt->lchild=CreateTree(A, 2*i, n);
bt->rchild=CreateTree(A, 2*i+1, n);
return bt;
}
}
//层次遍历
void LayeredOrderTraverse(BitTree *bt){
BitTree *QUEUE[N], *p;
int front, rear;
if(bt != NULL){
QUEUE[0] = bt;
front = 0;
rear = 1;
while(front < rear){
p = QUEUE[front++];
printf("%c ", p->ch);
if(p->lchild != NULL)
QUEUE[rear++] = p->lchild;
if(p->rchild != NULL)
QUEUE[rear++] = p->rchild;
}
}
}
//求结点所在层次
int LayerOrder(BitTree *bt, char c){
BitTree *STACK1[N], *p = bt;
int STACK2[N], flag, top = -1;
while(p != NULL || top != -1){
while(p != NULL){
STACK1[++top] = p;
STACK2[top] = 0;
p = p->lchild;
}
p = STACK1[top];
flag = STACK2[top--];
if(flag == 1){
if(p->ch == c)
return top+2;
p = NULL;//容易漏的一步
}
else{
STACK1[++top] = p;
STACK2[top] = 1;
p = p->rchild;
}
}
}
int main(){
int A[N]={'#','A','B','C','D','E','#','F','G','H'};
BitTree *bt=CreateTree(A,1,9);
printf("LayeredOrderTraverse:\n");
LayeredOrderTraverse(bt);
printf("\n结点A所在层次:\n");
printf("%d",LayerOrder(bt, 'A'));
printf("\n结点B所在层次:\n");
printf("%d",LayerOrder(bt, 'B'));
printf("\n结点C所在层次:\n");
printf("%d",LayerOrder(bt, 'C'));
printf("\n结点D所在层次:\n");
printf("%d",LayerOrder(bt, 'D'));
printf("\n结点E所在层次:\n");
printf("%d",LayerOrder(bt, 'E'));
printf("\n结点F所在层次:\n");
printf("%d",LayerOrder(bt, 'F'));
printf("\n结点G所在层次:\n");
printf("%d",LayerOrder(bt, 'G'));
printf("\n结点H所在层次:\n");
printf("%d",LayerOrder(bt, 'H'));
return 0;
}
/*
输入样例:ABDG##H##E##C#F##
A
/ \
B C
/ \ \
D E F
/ \
G H
*/
![]()