二叉树中根结点到某节点的路径(求某结点的所有祖先)

      假设二叉树用二叉链存储结构:

1.对于“找出根结点到叶子节点之间的路径”提供两种不同的算法:用栈辅助的基于后序非递归遍历的算法,和用队列辅助的基于层次遍历的算法。

2.对于某一给定的节点,求出它的所有祖先:递归求解。


具体实现代码如下:

/*
Author:Ibsen
Date:2015.12.15
*/
#include <iostream>
using namespace std;
const int M=1000;
typedef struct node
{
	char data;
	struct node *lc,*rc;
}BTree;
void Creat_BTree(BTree * &h,char *str)
{//读取括号表示法表示的二叉树
	BTree *st[M],*p;
	int pos=0,k,top=-1;
	char ch=str[0];
	h=NULL;
	while(ch!='\0')
	{
		switch(ch)
		{
			case '(':st[++top]=p; k=1; break;
			case ')':top--; break;
			case ',':k=2; break;
			default :p=new BTree();
					 p->data=ch;
					 p->lc=p->rc=NULL;
					 if(h==NULL) h=p;
					 else
					 {
					 	if(k==1) st[top]->lc=p;
					 	else st[top]->rc=p;
					 }
		}
		ch=str[++pos];
	}
}
void All_Path(BTree *h)
{//根结点到叶子节点的路径
	BTree *st[M],*p;
	int top=-1;
	if(h!=NULL)
	{
		do
		{
			while(h!=NULL)
			{
				st[++top]=h;
				h=h->lc;
			}
			p=NULL;
			bool flag=1;
			while(flag&&top>-1)
			{
				h=st[top];
				if(h->rc==p)
				{
					if(h->lc==NULL&&h->rc==NULL)
					{
						for(int i=0;i<top;i++)
							cout<<st[i]->data<<"-->";
						cout<<st[top]->data<<endl;
					}
					top--;
					p=h;
				}
				else
				{
					h=h->rc;
					flag=0;
				}
			}
		}while(top>-1);
		cout<<endl;
	}
}
void All_Path1(BTree *h)
{//根结点到叶子节点的逆路径
	struct snode
	{
		BTree *node;
		int par;
	}que[M];
	int head=-1,tail=-1;
	BTree *q;
	if(h!=NULL)
	{
		que[++tail].node=h;
		que[tail].par=-1;
		while(head!=tail)
		{
			q=que[++head].node;
			if(q->lc==NULL&&q->rc==NULL)
			{
				for(int i=head;que[i].par!=-1;i=que[i].par)
					cout<<que[i].node->data<<"<--";
				cout<<que[0].node->data<<endl;
			}
			if(q->lc!=NULL)
			{
				que[++tail].node=q->lc;
				que[tail].par=head;
			}
			if(q->rc!=NULL)
			{
				que[++tail].node=q->rc;
				que[tail].par=head;
			}
		}
	}
}
bool Ancestor(BTree *h,char x)
{
	if(h==NULL) return false;
	else if((h->lc!=NULL&&h->lc->data==x)||(h->rc!=NULL&&h->rc->data==x))
	{
		cout<<h->data<<"  ";
		return true;
	}
	else if(Ancestor(h->lc,x)||Ancestor(h->rc,x))
	{
		cout<<h->data<<"  ";
		return true;
	}
	else return false;
}
char str[M];
int main()
{
	BTree *h;
	while(cin>>str)
	{
		Creat_BTree(h,str);
		All_Path(h);
		All_Path1(h);
		cout<<"输出值为x的节点的所有祖先:"<<endl;
		char x;
		while(cin>>x)
		  if(!Ancestor(h,x)) cout<<"false!"<<endl;
		cout<<"*******"<<endl;
	}
	return 0;
}



你可能感兴趣的:(二叉树中根结点到某节点的路径(求某结点的所有祖先))