2021-11-07 中序二叉数的倒数第K个结点值

【问题描述】按先序次序建立一棵二叉树,输出中序遍历结果的倒数第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;
}

本文章仅供学习和参考!

欢迎交流~ 

Guess you like

Origin blog.csdn.net/m0_58489132/article/details/121191007