zoukankan      html  css  js  c++  java
  • 【C++编程赛】(2)二叉树基本操作

    //二叉树基本操作
    #include<iostream>
    #include <iomanip>
    using namespace std;
    
    int i=-1;//用于记录二叉树元素的层次(按树状打印输出)
    int j=-1;//用于记录二叉树元素的层次(按凹入表示输出)
    int k=0,sum=0;//用于记录二叉树元素的层次(返回T的深度)
    int g=0;//用于记录叶子数
    typedef struct BiNode{				//二叉链表定义
    	char data;
    	struct BiNode *lchild, *rchild,*change;//定义一个交换树
    }BiTNode, *BiTree;
    
    //用算法5.3 先序遍历的顺序建立二叉链表
    void CreateBiTree(BiTree &T){
    	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
    	char ch;
    	cin >> ch;
    	if (ch == '#')  T = NULL;			//递归结束,建空树
    	else{
    		T = new BiTNode;
    		T->data = ch;					//生成根结点
    		CreateBiTree(T->lchild);	//递归创建左子树
    		CreateBiTree(T->rchild);	//递归创建右子树
    	}								//else
    }									//CreateBiTree
    
    void InOrderTraverse(BiTree T){
    	//中序遍历二叉树T的递归算法
    	if (T){
    		InOrderTraverse(T->lchild);
    		cout << T->data;
    		InOrderTraverse(T->rchild);
    	}
    }
    //*****************************请学生把下面函数参数及实现等补充修改完整****************************************
    
    void PreOrderTraverse(BiTree T){
    	//先序遍历二叉树T的递归算法
    	if (T)
    	{
    		cout<< T->data;
    		PreOrderTraverse(T->lchild);
    		PreOrderTraverse(T->rchild);
    	}
    }
    void PostOrderTraverse(BiTree T){
    	//后序遍历二叉树T的递归算法
    	if (T)
    	{
    		PostOrderTraverse(T->lchild);
    		PostOrderTraverse(T->rchild);
    		cout << T->data;
    	}
    }
    void GYBTraverse(BiTree T)
    {//将二叉树以广义表形式输出
    	if (T)
    	{
    		cout<< T->data;
    		if(T->lchild!=NULL||T->rchild!=NULL)cout<< '(';
    		GYBTraverse(T->lchild);
    		if (T->rchild != NULL)cout << ',';
    		GYBTraverse(T->rchild);
    		if (T->lchild != NULL||T->rchild != NULL)cout << ')';
    	}
    }
    void SX_Traverse(BiTree T)
    {//按树状打印输出二叉树的元素,m 表示结点所在层次,初次调用时 m=0    
    	if (T)
    	{
    		i++;
    		SX_Traverse(T->rchild);
    		cout<<setw(4*i)<<T->data<<endl;
    		SX_Traverse(T->lchild);
    		i--;
    	}	
    }
    void OR_Traverse(BiTree T)
    {//将二叉树以凹入表示形式输出
    	if (T)
    	{
    		j++;
    		cout<<setw(4*j)<<T->data<<endl;
    		if(!T->lchild&&T->rchild)cout<<setw(4*(j+1))<<"#"<<endl;
    		OR_Traverse(T->lchild);
    		OR_Traverse(T->rchild);
    		if(T->lchild&&!T->rchild)cout<<setw(4*(j+1))<<"#"<<endl;
    		j--;
    	}
    }
    int count_n0(BiTree T)
    {//计算叶子数
    	if (T)
    	{
    		
    		count_n0(T->lchild);
    		count_n0(T->rchild);
    		if(!T->lchild&&!T->rchild)g++;
    	}
    	return g;
    }
    int BiTreeDepth(BiTree T)
    { // 初始条件:二叉树T存在。操作结果:返回T的深度
    	if (T)
    	{
    		k++;
    		BiTreeDepth(T->rchild);
    		if(k>=sum)sum=k;//用于记录二叉树深度
    		BiTreeDepth(T->lchild);
    		k--;
    	}
    	return sum;
    }
    void ChangeLR(BiTree T)
    {//交换左右子树
    
    	if (T)
    	{
    		ChangeLR(T->lchild);
    		ChangeLR(T->rchild);
    		T->change=T->lchild;
    		T->lchild=T->rchild;
    		T->rchild=T->change;
    	}
    }
    
    void main(){
    	BiTree tree;
    	cout << "请输入建立二叉链表的序列:
    ";
    	CreateBiTree(tree);
    	cout << "中序遍历的结果为:
    ";
    	InOrderTraverse(tree);
    	cout << endl;
    	//*********************以下内容请学生补充完整**************************************
    	cout << "先序遍历的结果为:
    ";
    	PreOrderTraverse(tree);
    	cout << endl;
    
    	cout << "后序遍历的结果为:
    ";
    	PostOrderTraverse(tree);
    	cout << endl;
    
    	cout << "将二叉树以广义表形式输出:
    ";
    	GYBTraverse(tree);
    	cout << endl;
    
    	cout << "按树状打印输出二叉树的元素:
    ";
    	SX_Traverse(tree);
    	cout << endl;
    
    	cout << "将二叉树以凹入表示形式输出:
    ";
    	OR_Traverse(tree);
    	cout << endl;
    
    	printf("树的叶子数=%d。
    ", count_n0(tree));
    	printf("树的深度=%d。
    ", BiTreeDepth(tree));
    
    	ChangeLR(tree);//交换左右子树
    
    	cout << "交换二叉树每个结点的左孩子和右孩子:
    ";
    	cout << "将二叉树以广义表形式输出:
    ";
    	GYBTraverse(tree);
    	cout << endl;
    
    	system("pause");
    }
    
  • 相关阅读:
    安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程
    android4.0浏览器在eclipse中编译的步骤
    android.net.wifi的简单使用方法
    android:sharedUserId 获取系统权限
    android 常见死机问题--log分析
    android anr分析方法
    android的logcat详细用法
    Android 设计模式 之 观察者模式
    Android 设计模式 之 单例模式
    android 自定义控件 使用declare-styleable进行配置属性(源码角度)
  • 原文地址:https://www.cnblogs.com/tzeyeung/p/13531374.html
Copyright © 2011-2022 走看看