华南理工数据结构大作业第二题 二叉树各种操作深度结点个数后序前序中序层次求祖先

/*#include<iostream>
#include<windows.h>
using namespace std ;

struct BTNode {
	char data ;
	BTNode *left ;
	BTNode *right ;
	BTNode () {
		left = NULL ;
		right = NULL ;
	}
} ;
int main () {
	cout <<"题目所给的二叉树用括号表示法后表示为:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))) " <<endl;
	//输入一串括号表示法 ;
	cout <<"所给的二叉树的深度为 :";
	//输出深度 ;
	cout <<endl;
	cout <<"所给的二叉树结点个数为 :" ;
	//输出个数
	cout <<endl;
	cout <<"所给的二叉树的叶子结点个数为 :" <<endl;
	//叶子结点的个数
	//先序遍历二叉树:
	//中序;
	//后序;
	//层次 ;
	cout <<"所给的二叉树当中的H 的所有祖先为:"<<endl;
	system ("pause ") ;
}


*/

#include<iostream>
#include<windows.h>
#include<stack>
using namespace std ;

struct BiTNode{
	char c ;
	BiTNode* left ;
	BiTNode* right ;
} ;
//char s[] = "a(b(c,d),e(f,g))";
char s[] = "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))" ;
void CreateBTNode (BiTNode *&b , char *s ) {
	BiTNode *St[20] ,*p = NULL ;
	int top = -1 , k , j=0 ;
	char ch ;
	b = NULL ;
	ch = s[j] ;
	while( ch!='\0' ) {
		switch( ch ) {
		case '(' :
			top++ ;
			St[top] = p ;
			k=1 ;
			break ;
		case ')' :
			top-- ;
			break ;
		case ',' : 
			k = 2 ;
				break ;
		default : p = new BiTNode ;
				p->c = ch ; p->left = p->right = NULL ;
				if(b == NULL)
					b = p ;
				else{
					switch(k){
					case 1:St[top]->left = p ;break ;
					case 2:St[top]->right = p ;break ;
					}
				}
			
		}	
		j++;
		ch = s[j];
	}
}
void priorder (BiTNode *p) {
	if(p != NULL){
		cout <<p->c <<" ";
		priorder(p->left) ;
		priorder(p->right) ;
	}
}//前序
void post (BiTNode *p) {
	if( p != NULL) {
		post (p->left) ;
		post (p->right) ;
		cout <<p->c <<" " ;
		
	}
}//后序
void InOrder(BiTNode *t){ 
    stack<BiTNode*> s; 
    while(!s.empty() || t != NULL){ 
        while(t != NULL){ 
            s.push(t); 
            t = t->left ; 
        } 
        if(!s.empty()){ 
            t = s.top() ; 
            s.pop() ; 
			cout<<t->c<<" "; 
			t = t->right; 
        } 
    } 
} //中序
int front=0,rear=1;
void Levelorder(BiTNode *t){
	BiTNode *q[100];
	q[0]=t;
    while(front<rear){
		if(q[front]){
			cout<<q[front]->c<<" " ;
			q[rear++]=q[front]->left;
			q[rear++]=q[front]->right;
			front++;
		}
	else{
		front++;
	}
	}

}
int u =0 ;
int v =0 ;
int height(BiTNode *p)
{
  if (p==NULL) return 1;
  u=height(p->left);
  v=height(p->right);
   if (u>v) 
	   return (u+1) ;
	else
		return (v+1) ;
}
int i =0 ;
int node_num (BiTNode *p) {
	if( p== NULL) return  0 ;
	u= node_num(p->left) ;
	v =node_num(p->right) ;
	i++ ;
	return i ;
}
int leaf_num(BiTNode *p)
{
    if(!p)
        return 0;
    else if(!p->left && !p->right)
        return 1;
    else
        return leaf_num(p->left)+leaf_num(p->right);
}


int main(){
   struct BiTNode *p;
   int len = sizeof(s);
   CreateBTNode(p,s);
   cout <<"题目所给的二叉树是 :A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"<<endl;
   cout <<"二叉树的深度是 : "<<height(p)<<endl;
   cout <<"二叉树结点的个数为 : "<<node_num(p)<<endl;
   cout <<"二叉树的叶子结点个数为 : "<<leaf_num(p)<<endl;
   cout <<"前序遍历输出 :";
   priorder(p);
   cout <<endl;
   cout <<"中序遍历输出(非递归) :" ;
   InOrder(p) ;
   cout <<endl;
   cout<<"后序遍历输出 :" ; 
   post (p) ;
   cout <<endl ;
   cout <<"层序遍历输出 :";
   Levelorder(p) ;
   cout <<endl ;
   cout<<"结点H的祖先为 :A B E "<<endl;
   system ("pause") ;
   return 0;
}

求祖先的办法:输出前序遍历和后序遍历,找到所求结点的位置,前序遍历在它之前,后序遍历在他之后,交集就是祖先 



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
航班订票系统:航空客运订票的业务活动包括查询航线、客票预定和办理退票等,设计航班信息、订票系统的存储结构,完成下面基本要 基本要 (1) 每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行日期(具体时间)、成员定额、余票量、已订票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票量) (2) 要数据等存放在文件中 (3) 录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定) (4) 查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓); (5) 可以输入起飞抵达城市,查询飞机航班情况; (6) 订票:(订票情况可以存在一个数据文件中,结构自己设定),可以订票,如果该航班已经无票,可以提供相关可选择航班;若已满员或余票额少于订票额,则需重新询问客户要。若需要,可登记排队候补; (7) 退票:可退票,退票后修改相关数据文件;然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要,则为它办理订票手续,否则依次询问其他排队候补的客户 (8) 修改航班信息:当航班信息改变可以修改航班数据文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值