树11——求根结点到任一结点之间的路径

树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)))
}

结果:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值