#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 50
//先序遍历序列中第k个结点的值
//递归版
void getPreK(BiTree T,int &count,int k,int &k_data){
if(T){
//做逻辑判断
count++;
if(k == count){
k_data = T->data;
}
getPreK(T->lchild,count,k_data);
getPreK(T->rchild,count,k_data);
}
}
//非递归版
int getPreKNR(BiTree T,int k){
BiTree stack[MaxSize],p = T;
int top = -1,count = 0;
while( p || top != -1){
if(p){
stack[++top] = p;
count++;
if(count == k){
return p->data;
}
p = p->lchild;
}else{
p = stack[top--];
p = p->rchild;
}
}
return -1;
}
//中序遍历求第k个结点的值
//递归版
void getInK(BiTree T,int k,int &count,int &k_data){
if(T){
getInK(T->lchild,k,count,k_data);
count++;
if(count == k){
k_data = T->data;
}
getInK(T->rchild,k,count,k_data);
}
}
//非递归版
int getInKByN(BiTree T,int k){
BiTree stack[MaxSize],p = T;
int top = -1,count = 0,
while(p || top != -1){
if(p){
stack[++top] = p;
p = p->lchild;
}else{
p = stack[top--];
count++;
if(count == k)
return p->data;
p = p->rchild;
}
}
return -1;
}
//后续遍历求第K个结点的值
//递归版
void getPostK(BiTree T,int k,int &count, int &k_data){
if(T){
getPostK(T->lchild,k,count,k_data);
getPostK(T->lchild,k,count,k_data);
count++;
if(count == k)
k_data = T->data;
}
}
//非递归版
int getPostByN(BiTree T,int k){
BiTree stack[MaxSize],p = T;
int top = -1,count = 0,tag[MaxSize] = {0};
while(p || top != -1){
if(p){
stack[++top] = p;
p = ->lchild;
tag[top] = 1;
}else{
p = stack[top];
if(tag[top]==1){
p = p->rchild;
tag[top] = 2;
}else{
count++;
if(count == k){
return p->data;
}
top--;
p = NULL;
}
}
}
return -1;
}
//层次遍历求第k个结点的值
int getLevelK(BiTree T,int k){
BiTree queue[MaxSize],p = T;
int front = -1,rear = -1,count = 0;
queue[++rear] = p;
while(front != rear){
p = queue[++front];
count++;
if(count == k)
return p->data;
if(p->lchild)
queue[++rear] = p->lchild;
if(p->rchild)
queue[++rear] = p->rchild;
}
return -1;
}
【数据结构】求第k个结点的值(分别用先,中,后,层次)
于 2022-10-27 15:13:19 首次发布