HPU--数据结构编程实训--树和二叉树

 下面是实训的第二题到第十二题,第一题我目前还没有写出来,如有小伙伴写出来了可以私信我共同讨论哟。

此代码只是头文件不是源文件,代码可直接当作头文件使用,仅提供相关算法的设计参考,没有主函数等。

1、
#include<iostream>
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{先序建立二叉树
	if (S[i] == '0') T = NULL;
	else
	{
		T = new BiTNode;
		T->data = S[i];
		CreateBiTree(T->lchild, S, ++i);
		CreateBiTree(T->rchild, S, ++i);
	}
}              
int Compare(BiTree T1, BiTree T2)
{//判断两棵二叉树是否相等,不相等返回0,相等返回1
	if (T1 == NULL && T2 == NULL) return 1;
	if (T1 == NULL && T2 != NULL) return 0;
	if (T1 != NULL && T2 == NULL) return 0;
	if (T1->data != T2->data) return 0;
	return Compare(T1->lchild, T2->lchild) && Compare(T1->rchild, T2->rchild);
}

2、
#include<iostream>
#include<cstring>
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{//先序建立二叉树
	if (S[i] == '0') T = NULL;
	else
	{
		T = new BiTNode;
		T->data = S[i];
		CreateBiTree(T->lchild, S, ++i);
		CreateBiTree(T->rchild, S, ++i);
	}
}
void ChangeRL(BiTree& T)
{//二叉树左右孩子的交换
	if (T == NULL)
	{
		return;
	}
	if (T->lchild == NULL && T->rchild == NULL)
	{
		return;
	}
		BiTree  Q;
		Q = T->lchild;
		T->lchild = T->rchild;
		T->rchild = Q;
		ChangeRL(T->lchild);
		ChangeRL(T->rchild);

}
void PreOrderTraverse(BiTree T)
{//先序遍历
	if (T)
	{
		cout << T->data;
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}


3、
#include<iostream>
#include <string.h>
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{//先序建立二叉树
	if (S[i] == '0') T = NULL;
	else
	{
		T = new BiTNode;
		T->data = S[i];
		CreateBiTree(T->lchild, S, ++i);
		CreateBiTree(T->rchild, S, ++i);
	}
}
void DoubleTraverse(BiTree T)
{//双序遍历二叉树T的递归算法
	if (T)
	{
		cout << T->data;
		DoubleTraverse(T->lchild);
		cout << T->data;
		DoubleTraverse(T->rchild);
	}
}

7、
#include<iostream>
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{//先序建立二叉树
	if (S[i] == '0') T = NULL;
	else
	{
		T = new BiTNode;
		T->data = S[i];
		CreateBiTree(T->lchild, S, ++i);
		CreateBiTree(T->rchild, S, ++i);
	}
}
void AllPath(BiTree T, char path[], int pathlen)
{//二叉树叶子结点到根结点的路径的求解

	int i;
	if (T != NULL)
	{
		if (T->lchild == NULL && T->rchild == NULL)
		{
			//cout<<" "<<T->data<<"到根结点路径:"; 
			cout << T->data;
			for (i = pathlen - 1; i >= 0; i--)
				cout << path[i];
			cout << endl;
		}
		else
		{
			path[pathlen] = T->data;
			pathlen++;
			AllPath(T->lchild, path, pathlen);
			AllPath(T->rchild, path, pathlen);
			pathlen--;
		}
	}
}

8、
#include<iostream>
#include<string.h>
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{//先序建立二叉树
	if (S[i] == '0') T = NULL;
	else
	{
		T = new BiTNode;
		T->data = S[i];
		CreateBiTree(T->lchild, S, ++i);
		CreateBiTree(T->rchild, S, ++i);
	}
}
void PreOrderTraverse(BiTree T)
{//二叉树的先序遍历
	if (T)
	{
		cout << T->data;
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}
void InOrderTraverse(BiTree T)
{//二叉树的中序遍历
	if (T)
	{
		
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}
void PostOrderTraverse(BiTree T)
{//二叉树的后序遍历
	if (T)
	{

		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		cout << T->data;
	}
}
9、
#include<iostream>
#include<string.h>
using namespace std;

typedef struct BiTNode
{
    char data;
    struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{//先序建立二叉树
    if (S[i] == '0') T = NULL;
    else
    {
        T = new BiTNode;
        T->data = S[i];
        CreateBiTree(T->lchild, S, ++i);
        CreateBiTree(T->rchild, S, ++i);
    }
}
int Ncount(BiTree T)
{
    if (T == NULL) return 0;
    else return Ncount(T->lchild) + Ncount(T->rchild) + 1;
}
void Count(BiTree T, int& a, int& b, int& c)
{//二叉树结点个数的统计
    int sum=Ncount(T);
    if (T == NULL);
    else
    {   
        if (T->lchild == NULL && T->rchild == NULL) a++;
        Count(T->lchild, a, b, c);
        Count(T->rchild, a, b, c);
    }
    c = a - 1;
    b = sum - c - a;
}

10、
#include<iostream>
#include <string.h>
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{//先序建立二叉树
	if (S[i] == '0') T = NULL;
	else
	{
		T = new BiTNode;
		T->data = S[i];
		CreateBiTree(T->lchild, S, ++i);
		CreateBiTree(T->rchild, S, ++i);
	}
}
int Depth(BiTree T)
{//二叉树高度的计算
	 int m, n;
	if (T==NULL) return 0;
	else
	{
		m = Depth(T->lchild);
		n = Depth(T->rchild);
		if (m > n) return (m + 1);
		else return (n + 1);
	}
}

12、
#include<iostream>
using namespace std;
typedef struct BiTNode
{
	int weight;
	struct BiTNode* left, * right;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T)
{//先序建立二叉树
	int ch;
	cin >> ch;
	if (ch == 0) T = NULL;
	else
	{
		T = new BiTNode;
		T->weight = ch;
		CreateBiTree(T->left);
		CreateBiTree(T->right);
	}
}
int WPL(BiTree& T, int d)
{//求二叉树T的带权路径长度
	int wpl = 0;
	if (T != NULL)
	{
		if (T->left == NULL && T->right == NULL)
		{
			wpl += T->weight * d;
		}
		wpl += WPL(T->left, d + 1);
		wpl += WPL(T->right, d + 1);
	}
	return wpl;
}

4、
#include<iostream>
#include <string.h>
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{//先序建立二叉树
	if (S[i] == '0') T = NULL;
	else
	{
		T = new BiTNode;
		T->data = S[i];
		CreateBiTree(T->lchild, S, ++i);
		CreateBiTree(T->rchild, S, ++i);
	}
}
void DoubleTraverse(BiTree T)
{//双序遍历二叉树T的递归算法
	if (T)
	{
		cout << T->data;
		DoubleTraverse(T->lchild);
		cout << T->data;
		DoubleTraverse(T->rchild);
	}
}

5、
 #include <iostream>
#include <string.h>
using namespace std;

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

BiTree CreateBiTree(int &pos, char *str)
{// 先序建立二叉树
   BiTree T;
   if(str[pos]=='0') T=NULL;
   else
   {
       T=new BiTNode;
       T->data=str[pos];
       T->lchild =CreateBiTree(++pos,str);
       T->rchild =CreateBiTree(++pos,str);
   }
   return T;
}

int Width(BiTree T)
{// 求二叉树T最大宽度
   if(T==NULL)
		return 0;
 	BiTree Q[100];
  	int front=1,rear=1,last=1,width=0,WidthMax=0;
	Q[rear]=T;	
	while(front<=last)
	{
      	width++;
		BiTree P=Q[front++];
		if(P->lchild)		
			Q[++rear]=P->lchild;
		if(P->rchild)
			Q[++rear]=P->rchild;
		if(front>last)
		{
			last=rear;
			WidthMax=WidthMax>width?WidthMax:width;
			width=0;
		}
	}
  	return WidthMax;
}

6、
 #include<iostream>
#define MAXSIZE 100
using namespace std;
typedef struct BiTNode
{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T,char S[],int &i)
{//先序建立二叉树
    if(S[i]=='0') T=NULL;
    else
    {
        T=new BiTNode;
        T->data=S[i];
        CreateBiTree(T->lchild,S,++i);
        CreateBiTree(T->rchild,S,++i);
    }
}
int len;
char str[MAXSIZE];
int ans[MAXSIZE];
void dfs(BiTree T,int n)
{
	if(T)
	{
		ans[n]=T->data;
		if(!T->lchild&&!T->rchild)
		{
			if(n+1>len)
			{
				len=n+1;
				for(int i=0;i<=n;i++)
					str[i]=ans[i];
			}
		}
		else
		{
			dfs(T->lchild,n+1);
			dfs(T->rchild,n+1);
		}
	}
}

void LongestPath(BiTree T)
{//二叉树最长路径的求解
    len=0;
    dfs(T,len);
    cout<<len<<endl;
		for(int i=0;i<len;i++)
			cout<<str[i];
		cout<<endl;


}

11、
#pragma once
#include<iostream>
#define MAXSIZE 100
using namespace std;
typedef struct BiTNode
{//二叉树的双链表存储表示
	double data;          //结点数据域
	bool ischaracter;      //判断结点是否为字符
	struct BiTNode* lchild, * rchild;    //左右孩子指针
}BiTNode, * BiTree;
typedef struct
{//字符栈的存储结构
	char* base;     //栈底指针
	char* top;       //栈顶指针
	int stacksize;   //栈可用的最大容量
}SqStack1;
typedef struct
{//结点栈的存储结构
	BiTree* base;
	BiTree* top;
	int stacksize;
}SqStack2;
void InitStack1(SqStack1& s)
{//字符栈的初始化
	s.base = new char;
	if (!s.base)
	{
		cout << "内存分配失败!\n";
		exit(0);
	}
	s.top = s.base;
	s.stacksize = MAXSIZE;
}

void InitStack2(SqStack2& s)
{//结点栈的初始化
	if (!(s.base = new BiTree))
		exit(0);
	s.top = s.base;
	s.stacksize = MAXSIZE;
}
void Push1(SqStack1& s, char ch)
{//字符入栈操作
	if (s.top - s.base == s.stacksize) return;
	*s.top++ = ch;
}
void Push2(SqStack2& s, BiTree t)
{//结点入栈操作
	if (s.top - s.base == s.stacksize) return;
	*s.top++ = t;
}
void Pop1(SqStack1& s, char& ch)
{//字符出栈操作

	if (s.top == s.base)
		return ;
	ch = *--s.top;
}
void Pop2(SqStack2& s, BiTree& t)
{//结点出栈操作

	if (s.top == s.base)
		return;
	t = *--s.top;
}
char GetTop(SqStack1 s)
{//取字符栈的栈顶元素
	if (s.top != s.base)
	return *(s.top - 1);
}
bool EmptyStack(SqStack1 s)
{//栈的判空操作
	if (s.top == s.base) return true;
	else return false;
}
char Precede(char a, char b)
{//判断符号的优先级
	int i, j;
	char pre[7][7] =
	{
			{'>','>','<','<','<','>','>'},
			{'>','>','<','<','<','>','>'},
			{'>','>','>','>','<','>','>'},
			{'>','>','>','>','<','>','>'},
			{'<','<','<','<','<','=','0'},
			{'>','>','>','>','0','>','>'},
			{'<','<','<','<','<','0','='}
	};
	switch (a) {
	case '+': i = 0; break;
	case '-': i = 1; break;
	case '*': i = 2; break;
	case '/': i = 3; break;
	case '(': i = 4; break;
	case ')': i = 5; break;
	case '=': i = 6; break;
	}
	switch (b) {
	case '+': j = 0; break;
	case '-': j = 1; break;
	case '*': j = 2; break;
	case '/': j = 3; break;
	case '(': j = 4; break;
	case ')': j = 5; break;
	case '=': j = 6; break;
	}
	return pre[i][j];
	
}
double Operate(double a, char ch, double b)
{//运算操作,返回相应的数值结果
	double c;
	switch (ch)
	{
	case '+':
		c = a + b;
		break;
	case '-':
		c = a - b;
		break;
	case '*':
		c = a * b;
		break;
	case '/':
		c = a / b;
		break;
	}
	return c;
}
bool IsCharacter(char ch)
{//判断ch是否为+、-、*、/、(、)、= 这类的字符,是则返回true
	switch (ch)
	{
	case '+':
	case '-':
	case '*':
	case '/':
	case '(':
	case ')':
	case '=':
		return true;
	default:
		return false;
	}

}
double InOrder(BiTree T)
{//中序遍历二叉树并求表达式的值
	double lvalue;
	double rvalue;
	char theta;
	if (T == NULL)
		return 0;
	else
	{
		if (T->lchild == NULL && T->rchild == NULL)
			return T->data - '0';
		else
		{
			lvalue = InOrder(T->lchild);
			theta = T->data;
			rvalue = InOrder(T->rchild);
			
			return Operate(lvalue, theta, rvalue);
		}
	}
}
void CreateBT(char ch[], BiTree& t, SqStack1 optr, SqStack2 expt)
{//创建二叉树
	char c,x, theta;
	BiTree a, b;
	int i = 0;
	c = ch[i++];
	x = GetTop(optr);
	while (c != '=' || x != '=')
	{
		if (IsCharacter(c))
		{
			switch (Precede(x, c))
			{
			case '<':
				Push1(optr, c);
				c = ch[i++];
				break;

			case '=':
				Pop1(optr,x);
				c = ch[i++];
				break;
			case '>':
				Pop1(optr, theta);
				BiTree TEMP;
				TEMP = new BiTNode;
				if (!TEMP)
					exit(-1);
				TEMP->data = theta;
				Pop2(expt, b);
				Pop2(expt, a);

				TEMP->lchild = a;
				TEMP->rchild = b;
				Push2(expt, TEMP);

				t = TEMP;
				break;
			}
		}

		if (c >= '0' && c <= '9')
		{
			BiTree Temp;
			Temp = new BiTNode;
			if (!Temp)
				exit(-1);
			Temp->data = c;
			Temp->lchild = NULL;
			Temp->rchild = NULL;
			Push2(expt, Temp);

			c = ch[i++];;
		}
		x = GetTop(optr);

	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值