下面是实训的第二题到第十二题,第一题我目前还没有写出来,如有小伙伴写出来了可以私信我共同讨论哟。
此代码只是头文件不是源文件,代码可直接当作头文件使用,仅提供相关算法的设计参考,没有主函数等。
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);
}
}