算法一
//非递归队列求二叉树深度
int BTDepth(BiNode *T){
if(!T) return 0;
int front = -1, rear = -1;
int last = 0;
int level = 0;
BiNode* Queue[maxsize];
Queue[++rear] = T;
BiNode *temp;
while(front != rear){
temp = Queue[++front];
if(temp->lchild){
Queue[++rear] = temp->lchild;
}
if(temp->rchild){
Queue[++rear] = temp->rchild;
}
if(front == last){
last = rear;
level++;
}
}
return level;
}
算法二
int BTDepth1(BiNode *T){
if(!T) return 0;
int ldep = BTDepth1(T->lchild);
int rdep = BTDepth1(T->rchild);
if(ldep > rdep){
return ldep + 1;
}
return rdep + 1;
}
算法三
int BTDepth2(BiNode *T){
if(!T) return 0;
BiNode* stack[maxsize];
int most = 0;
int top = -1;
BiNode* temp = (BiNode *)malloc(sizeof(BiNode));
BiNode *p = temp;
stack[++top] = T;
while(top != -1){
if(stack[top]->lchild && stack[top]->lchild != temp && stack[top]->rchild != temp){
top++;
stack[top] = stack[top-1]->lchild;
}
else if(stack[top]->rchild && stack[top]->rchild != temp){
top++;
stack[top] = stack[top-1]->rchild;
}
else{
if(top>most) most = top;
temp = stack[top];
top--;
}
}
free(p);
return most+1;
}
测试环境
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 100
//二叉树的创建序列
//ab#df###c#e##
typedef struct BiNode{
char date;
struct BiNode *lchild,*rchild;
}BiNode;
BiNode* CreateBiTree();
int BTDepth(BiNode *T);
int BTDepth1(BiNode *T);
int BTDepth2(BiNode *T);
int main(){
BiNode* t = CreateBiTree();
int most = BTDepth2(t);
printf("%d",most);
return 0;
}
// 借助栈后序遍历二叉树求二叉树的深度(栈达到最大高度即为树的深度)
int BTDepth2(BiNode *T){
if(!T) return 0;
BiNode* stack[maxsize];
int most = 0;
int top = -1;
BiNode* temp = (BiNode *)malloc(sizeof(BiNode));
BiNode *p = temp;
stack[++top] = T;
while(top != -1){
if(stack[top]->lchild && stack[top]->lchild != temp && stack[top]->rchild != temp){
top++;
stack[top] = stack[top-1]->lchild;
}
else if(stack[top]->rchild && stack[top]->rchild != temp){
top++;
stack[top] = stack[top-1]->rchild;
}
else{
if(top>most) most = top;
temp = stack[top];
top--;
}
}
free(p);
return most+1;
}
//递归求二叉树的深度
int BTDepth1(BiNode *T){
if(!T) return 0;
int ldep = BTDepth1(T->lchild);
int rdep = BTDepth1(T->rchild);
if(ldep > rdep){
return ldep + 1;
}
return rdep + 1;
}
//非递归队列求二叉树深度
int BTDepth(BiNode *T){
if(!T) return 0;
int front = -1, rear = -1;
int last = 0;
int level = 0;
BiNode* Queue[maxsize];
Queue[++rear] = T;
BiNode *temp;
while(front != rear){
temp = Queue[++front];
if(temp->lchild){
Queue[++rear] = temp->lchild;
}
if(temp->rchild){
Queue[++rear] = temp->rchild;
}
if(front == last){
last = rear;
level++;
}
}
return level;
}
//递归方法中序创建二叉树
BiNode* CreateBiTree(){
BiNode *p;
char a;
scanf("%c",&a);
if(a=='#')
p=NULL;
else{
p=(BiNode *)malloc(sizeof(BiNode));
p->date=a;
p->lchild=CreateBiTree();
p->rchild=CreateBiTree();
}
return p;
}
//递归方法中序遍历二叉树
void Traverse(BiNode *p){
if(p==NULL){
return;
}
else{
Traverse(p->lchild);
printf("%c",p->date);
Traverse(p->rchild);
}
return;
}