实验6:树和二叉树的实验2 二叉链表

一、实验目的

1、   熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;

2、   掌握树的顺序结构的实现;

3、   学会运用树的知识解决实际问题

二、 实验内容

1、自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实现树的构造,并完成:

1)用前序遍历、中序遍历、后序遍历输出结点数据;

2)以合理的格式,输出各个结点和双亲、孩子结点信息;

3)输出所有的叶子结点信息;

2、试设计一个程序,将输入的字符串转化为对应的哈夫曼编码,然后再将这个哈夫曼编码序列进行解码,也就是恢复原来的字符串序列。(*


三、实验步骤

1、依据实验内容,先确定具体的二叉树,并说明结点的数据类型;

2、设计具体的算法;

3、写出完整程序;

4、总结、运行结果和分析算法效率。

5、总体收获和不足,疑问等。

四、实验要求

1、   按照数据结构实验任务书,提前做好实验预习与准备工作。

2、   在个人主页上发文章提交作业。

3、   实验课会抽查3-5人,希望你可以被查到!


五、源代码

#include
     
     
      
      
using namespace std;

typedef struct node
{
	struct node *leftChild;
	struct node *rightChild;
	char data;
}BiTreeNode, *BiTree;


BiTreeNode *createnode(char c)
{
	BiTreeNode *q=new BiTreeNode;
	q->leftChild=NULL;
	q->rightChild=NULL;
	q->data=c;
	return q;
}

void createBiTree(BiTree &T)
{
	char c;
	cin >> c;
	if(c == '#')
		T = NULL;
	else
	{
		T = new BiTreeNode;
		T->data = c;
		createBiTree(T->leftChild);
		createBiTree(T->rightChild);
	}
}


int max(int a, int b )
{
	return a < b ? b : a;
}


int Depth(BiTree T)
{
	if ( T== NULL)
		return 0;
 
	int leftDepth = Depth(T->leftChild);
	int rightDepth = Depth(T->rightChild);

	return 1+ max(leftDepth, rightDepth);
}


void PrintNodeatlevel(BiTree T,int level)
{
	if(T==NULL || level<1)
		return;
	if(level==1)
	{
		cout<
      
      
       
       data<<" ";
		return;
	}
	PrintNodeatlevel(T->leftChild,level-1);
	PrintNodeatlevel(T->rightChild,level-1);
}


void LevelTraverse(BiTree T)
{
	if(T==NULL)
		return;
	int depth=Depth(T);
	for(int i=1;i<=depth;i++)
	{
		PrintNodeatlevel(T,i);
		cout<
       
       
        
        leftChild==NULL && T->rightChild==NULL)
		{
			cout<
        
        
         
         data<<" ";
		}
		LeavesTraverse(T->leftChild);
		LeavesTraverse(T->rightChild);
}


int getleafnode(BiTree T)
{
	if(T==NULL)
		return 0;
	if(T->leftChild==NULL && T->rightChild==NULL)
		return 1;
	return getleafnode(T->leftChild)+getleafnode(T->rightChild);
}


int getallnode(BiTree T)
{
	if(T==NULL)
		return 0;
	return 1+getallnode(T->leftChild)+getallnode(T->rightChild);
}

	
BiTreeNode *parent(BiTreeNode *T,char c)
{
	if(T==NULL)
		return NULL;
	if(T->leftChild!=NULL && T->leftChild->data==c)
	{
		return T;
	}
	if(T->rightChild!=NULL && T->rightChild->data==c)
	{
		return T;
	}
	BiTreeNode *p=parent(T->leftChild,c);
	if(p!=NULL)
	{
		return p;
	}
	p=parent(T->rightChild,c);
	return p;
}


BiTreeNode *children(BiTreeNode *T,char c)
{
	if(T==NULL)
		return NULL;
	if(T->data==c)
	{
		if(T->leftChild!=NULL && T->rightChild!=NULL)
			cout<<"左孩子:"<
         
         
           leftChild->data< 
          
            <<"右孩子:"< 
           
             rightChild->data< 
            
              leftChild==NULL && T->rightChild!=NULL) cout<<"左孩子为空!"< 
             
               <<"右孩子:"< 
              
                rightChild->data< 
               
                 leftChild!=NULL && T->rightChild==NULL) cout<<"左孩子:"< 
                
                  leftChild->data< 
                 
                   <<"右孩子为空!"< 
                  
                    leftChild==NULL && T->rightChild==NULL) cout<<"没有孩子!"< 
                   
                     leftChild,c); if(p!=NULL) { return p; } p=children(T->rightChild,c); return p; } void preorder(BiTree T) { if(T==NULL)return; if(T!=NULL) { cout< 
                    
                      data<<" "; preorder(T->leftChild); preorder(T->rightChild); } } void inorder(BiTree T) { if(T==NULL)return; if(T!=NULL) { inorder(T->leftChild); cout< 
                     
                       data<<" "; inorder(T->rightChild); } } void postorder(BiTree T) { if(T==NULL)return; if(T!=NULL) { postorder(T->leftChild); postorder(T->rightChild); cout< 
                      
                        data<<" "; } } // ----------------------------------------------------------------------------------------------- int main() { BiTree T; char x; BiTreeNode *p; cout<<"输入一棵树:"; createBiTree(T); cout< 
                       
                         >x; p=parent(T,x); if(p!=NULL) { cout<<"双亲:"< 
                        
                          data; } else cout<<"找不到双亲!"; cout< 
                         
                           < 
                          
                            >x; p=children(T,x); cout< 
                            
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
         
        
        
       
       
      
      
     
     



输入如图所示二叉树


六、运行结果


七、心得
在二叉树的顺序结构的实现中,我用了一维数组来存储实现,根据双亲与孩子之间的关系来求得双亲信息或者孩子信息,在二叉树的链式存储中,定义了左孩子和右孩子两个结点指针,在层序输出二叉树时,用了我在网上看到的一个方法,就是用递归的方法,根据二叉树的层级来输出二叉树,将根结点定为第一层,左子树与右子树的层级依次增加,从而使二叉树层序输出;在求双亲与孩子时,一开始由于对条件判定的不完全而导致频频出错,差点想要放弃,后来经过不断的调试,最终使程序成功运行,很开心。


版权声明:本文为weixin_40132866原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。