树11——求根结点到任一结点之间的路径
二叉树
已知一棵二叉树用二叉树用二叉链表存储,t指向根结点,p指向树中任一结点,要求编写算法,输出从t到p之间路径上的结点。
这是南京航空航天大学考研题,主要考查二叉树的后序遍历。由于后序遍历二叉树的过程中,访问到r所指结点时,此时栈中所有结点均为r所指的祖先,由这些祖先便构成了一条从根结点到r所指结点之间的路径,故可采用后序遍历。
code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#include <iomanip>
typedef char DataType;
#define MAXSIZE 100
typedef struct Node
{
DataType data;
struct Node *lchild, *rchild;
}BitNode,*BiTree;
void CreateBitTree(BiTree *T, char str[]);
void PrintLevel(BiTree T);
void CreateBitTree(BiTree *T, char str[])
{
char ch;
BiTree stack[MAXSIZE];
int top = -1;
int flag, k;
BitNode *p;
*T = NULL, k = 0;
ch = str[k];
while (ch!='\0')
{
switch (ch)
{
case '(':
stack[++top] = p;
flag = 1;
break;
case ')':
top--;
break;
case ',':
flag = 2;
break;
default:
p = (BiTree)malloc(sizeof(BitNode));
p->data = ch;
p->lchild = NULL;
p->rchild = NULL;
if (*T==NULL)
{
*T = p;
}
else
{
switch (flag)
{
case 1:
stack[top]->lchild = p;
break;
case 2:
stack[top]->rchild = p;
break;
}
}
}
ch = str[++k];
}
}
void TreePrint(BiTree T, int level)
{
int i;
if (T==NULL)
{
return;
}
TreePrint(T->rchild, level + 1);
for (i = 0; i < level;i++)
{
printf(" ");
}
printf("%c\n", T->data);
TreePrint(T->lchild, level + 1);
}
void Path(BiTree root, BitNode *r)
{
BitNode *p, *q;
int i, top = 0;
BitNode *s[MAXSIZE];
q = NULL;
p = root;
while (p!=NULL||top!=0)
{
while (p!=NULL)
{
top++;
if (top>=MAXSIZE)
{
exit(-1);
}
s[top] = p;
p = p->lchild;
}
if (top>0)
{
p = s[top];
if (p->lchild==NULL||p->rchild==q)
{
if (p==r)
{
for (i = 1; i <= top;i++)
{
cout << setw(4) << s[i]->data;
}
top = 0; p = NULL;
}
else
{
q = p;
top--;
p = NULL;
}
}
else
{
p = p->rchild;
}
}
}
}
BiTree FindPointer(BiTree T, DataType e)
{
BiTree Q[MAXSIZE];
int front = 0, rear = 0;
BitNode *p;
if (T)
{
Q[rear] = T;
rear++;
while (front!=rear)
{
p = Q[front];
front++;
if (p->data==e)
{
return p;
}
if (p->lchild)
{
Q[rear] = p->lchild;
rear++;
}
if (p->rchild)
{
Q[rear] = p->rchild;
rear++;
}
}
}
return NULL;
}
void main()
{
BiTree T;
BitNode *s;
DataType e;
char str[MAXSIZE];
cout << "请输入二叉树的广义表形式:" << endl;
cin >> str;
cout << "由广义表形式的字符串构造二叉树:" << endl;
CreateBitTree(&T,str);
TreePrint(T, 1);
cout << "请输入一个结点:" << endl;
cin >> e;
s = FindPointer(T, e);
cout << "从根结点到结点元素" <<e<<"之间路径上的结点为:"<< endl;
Path(T, s);
cout << endl;
system("pause");
//(A(B(D(H,I),E),C(F(J),G)))
}
结果: