【问题描述】按先序次序建立一棵二叉树,输出中序遍历结果的倒数第K个结点值
【输入形式】
【输出形式】
【样例输入】abd##e##cf#gh##i###
3
【样例输出】g
【样例说明】该二叉树中序遍历结果为dbeafhgic,要求输出倒数第三个结点值,输出结果为g
【运行结果如下】
【代码如下】
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild; //左右孩子指针
}BiTNode, *BiTree;
//链栈的定义
typedef struct StackNode
{
BiTNode data;
struct StackNode *next;
}StackNode,*LinkStack;
void CreateBiTree(BiTree &T)
{
/*构造二叉树*/
char ch;
scanf("%c",&ch);
if(ch == '#') T = NULL;
else
{
T = new BiTNode;
if (!T) exit(OVERFLOW); //创建结点失败
T->data = ch; //生成根结点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
}
void InitStack(LinkStack &S)
{
//构造一个空栈S,栈顶指针置空
S = NULL;
}
bool StackEmpty(LinkStack S)
{
if(!S)
return true;
return false;
}
void Push(LinkStack &S,BiTree e)
{
/*入栈*/
LinkStack p = new StackNode;
p->data = *e;
p->next = S;
S = p;
}
void Pop(LinkStack &S,BiTree e)
{
/*出栈*/
if(S == NULL) return; //空栈
*e = S->data;
S = S->next;
}
void InTraverse(BiTree &T)
{
/*中序遍历*/
BiTree p = T;;
BiTree q = new BiTNode;
LinkStack S;
InitStack(S);
char ch[30];
int i = 1;
int k;
scanf("%d",&k);
while(p || !StackEmpty(S))
{
if(p)
{
Push(S,p);
p = p->lchild;
}
else
{
Pop(S,q);
ch[i] = q->data; //将中序遍历结果存入数组中
i++;
p = q->rchild;
}
}// while
printf("%c",ch[i-k]); //输出倒数第k个结点值
}
int main()
{
BiTree T;
CreateBiTree(T);
InTraverse(T);
return 0;
}
本文章仅供学习和参考!
欢迎交流~