6-7 先序输出第i个结点
本题要求实现对于给定的二叉树,打印先序序列中指定序号的结点。
函数接口定义:
void PrintNode(BiTree T);
T是二叉树树根指针,PrintNode函数输出给定二叉树的先序序列中第n个结点,n为结点在先序序列中的序号,从1开始编号。
其中BinTree结构定义如下:
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree Create();/* 细节在此不表 */
void PrintNode(BiTree T);
int n;//要打印的结点的在先序序列中的序号
int main()
{
BiTree T = Create();
scanf("%d", &n);
printf("The %d-th node in preorder is: ", n);
PrintNode(T);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输出样例(对于图中给出的树,当输入的n为2时):
The 2-th node in preorder is: B
1.(非递归)代码如下:
void PrintNode(BiTree T)//先序(非递归)
{
BiTree data[100];
int top=-1;
int i=0;
BiTree p = T;//p是遍历指针
while (p || top!=-1)//栈不空或者p不空循环
{
if (p != NULL) { //根指针进栈,遍历左子树
i++;
if(i==n)
printf("%c",p->data);
data[++top]=p; //每遇到非空二叉树先向左走
p = p->lchild;
}
else { //根指针退栈,访问根结点,遍历右子树
p = data[top--]; //退栈
p = p->rchild; //再向右子树走
}
}
}
2.递归算法如下:
//递归
int i = 0;
void PrintNode(BiTree T)//先序
{
if (T != NULL) {
i++;
if (i == n)
printf("%c", T->data);
PrintNode(T->lchild);
PrintNode(T->rchild);
}
}