《数据结构教程》(第5版)李春葆 学习笔记(四)

一些简单的关于二叉树的算法:

#include <iostream>
#include<cstdlib>
using namespace std;

typedef char ElemType;
const int MaxSize=100;

typedef struct node{
	ElemType data;
	struct node *lchild;
	struct node *rchild;
}BTNode;

 //创建二叉树 
void CreateBTree(BTNode *&b,ElemType *str){
	BTNode *St[MaxSize],*p;
	b=NULL;
	int top=-1,k;
	ElemType ch;
	for(int i=0;(ch=str[i])!='\0';i++){
		switch(ch){
			case '(':St[++top]=p;k=1;break;
			case ')':top--;break;
			case ',':k=2;break;
			default:
				p=(BTNode*)malloc(sizeof(BTNode));
				p->data=ch;
				p->lchild=p->rchild=NULL;
				if(b==NULL)b=p;
				else{
					switch(k){
						case 1:St[top]->lchild=p;break;
						case 2:St[top]->rchild=p;break;
					}
				}
		}
	}
} 
 
//计算二叉树的所有结点数
int Nodes(BTNode *b){
	if(b==NULL)return 0;
	else return Nodes(b->lchild)+Nodes(b->rchild)+1;
}  

//输出二叉树的所有叶子结点
void DispLeaf(BTNode *b){
	if(b!=NULL){
	if(b->lchild==NULL&&b->rchild==NULL)cout<<b->data;
	DispLeaf(b->lchild);
	DispLeaf(b->rchild); 
    }
} 

//求二叉树中结点值为x的结点的深度
int Level(BTNode* b,ElemType x,int h){
	if(b==NULL) return 0;
	else if(b->data==x) return h;
	else{
		int left=Level(b->lchild,x,h+1);
		if(left!=0) return left;
		else return Level(b->rchild,x,h+1);
	}
} 

//求二叉树中第k层的结点个数
void Lnodenum(BTNode* b,int h,int k,int &n){
	if(b==NULL) return;
	else{
		if(h==k) n+=1;
		else if(h<k){
			Lnodenum(b->lchild,h+1,k,n);
			Lnodenum(b->rchild,h+1,k,n);
		}
	}
} 

//输出值为x的结点的所有祖先
bool ancestor(BTNode* b,ElemType x){
	if(b==NULL) return false;
	else {
    	if(b->data==x) return true;
	    else{
        	if(ancestor(b->lchild,x)||ancestor(b->rchild,x)){
	        	cout<<b->data;
	        	return true;
        	}
            else return false;
    }
}
} 
 
int main() {
	ElemType str[]="A(B(D(,G)),C(E,F))";
	BTNode* b;
	CreateBTree(b,str);
	ElemType x; 
	cin>>x;
	ancestor(b,x);
/*	int k,n=0;
	cin>>k;
	Lnodenum(b,1,k,n);
	cout<<n<<endl;
	*/
	
//	cout<<Nodes(b)<<endl;
//  DispLeaf(b);

/*    ElemType x;
    cin>>x;
    int h=Level(b,x,1);
    if(h==0) cout<<"二叉树中没有节点值为"<<x<<"的结点。"<<endl;
	else cout<<"二叉树中节点值为"<<x<<"的结点的深度为:"<<h<<endl;
	*/
	return 0;
}

不妥之处,请多多指教。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构教程》是李春葆撰写的一本经典教材,这里提到的第三是其更新后的本。这本教材是计算机科学和软件工程专业的学生必备的参考书之一。 这本教程数据结构作为核心内容,系统而全面地介绍了各种数据结构及其应用。其中包括线性表、栈、队列、树、图等常见的数据结构以及它们的操作和实现方式。每个章节都有详细而清晰的讲解,配有大量的示例和习题,有助于读者理解和掌握各种数据结构的基本知识和算法。 教材的第三相比前两进行了全面的更新和改进。在保留经典内容的基础上,增加了一些新的数据结构算法的讲解,如红黑树、哈希表、最短路径算法等。并且,教材还增加了一些实际应用的案例分析,如文件系统、数据库管理系统等,让读者更好地理解数据结构在实际应用中的作用和意义。 这本教程深入浅出,适合初学者和有一定编程基础的读者阅读。它不仅给出了数据结构的原理和概念,更重要的是通过丰富的例子和习题培养了读者的实际操作和问题解决能力。同时,教材还提供了配套的源代码和实验指导,供读者进一步学习和实践。 总之,《数据结构教程李春葆第三是一本值得推荐的编程教材。无论是学生还是从事计算机相关工作的专业人士,阅读并掌握其中的知识都将对他们的编程能力和问题解决能力有所提升。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值