#编程作业,浅浅记录一下:
头文件:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
#include<stdio.h>
#include<stack>
using namespace std;
typedef struct lnode {
char c;
lnode* left;
lnode* right;
}lnode, * zhi;
stack<zhi> z;
int n = 0;
访问二叉树:
包括前,中,后递归遍历,中序栈遍历,以及叶子节点的数量和树的深度。
bool visit(char t) {
cout << t;
return true;
}
bool preorder(lnode* T) {
if (T) {
if (visit(T->c)) {
if (preorder(T->left))
if (preorder(T->right))return 1;
return 0;
}
}
else return 1;
}
bool inorder(lnode* T) {
if (T) {
if (inorder(T->left)) {
if (visit(T->c))
if (inorder(T->right))return 1;
}
}
else return 1;
}
bool lastorder(lnode* T) {
if (T) {
if (lastorder(T->left)) {
if (lastorder(T->right))
if (visit(T->c))return 1;
}
}
else return 1;
}
bool ino(lnode* T) {
z.push(T);
lnode* p;
while (!z.empty()) {
while ((p = z.top()) && p)z.push(p->left);
z.pop();
if (!z.empty())
{
p = z.top();
z.pop();
if (!visit(p->c))return 0;
z.push(p->right);
}
}
return 1;
}
int getdepth(lnode* T) {
int llength, rlength, mlength;
if (T != NULL) {
llength = getdepth(T->left);
rlength = getdepth(T->right);
mlength = llength > rlength ? llength : rlength;
return mlength + 1;
}
else
{
return 0;
}
}
int getleaves(lnode* T) {
int lleaves, rleaves;
//if (T->left == NULL && T->right == NULL)return 1;
if (T != NULL && T->left == NULL && T->right == NULL) {
return 1;
}
else
{
if (T != NULL) {
lleaves = getleaves(T->left);
rleaves = getleaves(T->right);
return lleaves + rleaves;
}
else return 0;
}
}
由先序式子构建二叉树:
例如:
输入:
AB#C##D##
输出:(先序,中序,后序)
-+ab/de
a+b-d/e
ab+de/-
构建二叉树:
void creat(lnode** T) {//指向指针的地址,即用T的值(*T)是(lnode*)指针的地址
char ch;
scanf("%c", &ch);
if (ch == '#')*T = NULL;
else {
if (!(*T = (lnode*)malloc(sizeof(lnode)))) {
}
(*T)->c = ch;
creat(&(*T)->left);
creat(&(*T)->right);
}
}//先序递归创建
由先缀表达式构建二叉树:
输入:
-+ab/de
输出:
-+ab/de
a+b-d/e
ab+de/-
构建二叉树:
在前面的基础上稍加修改。
void creat2(lnode** T) {//前缀表达式指向指针的地址,
char ch;
scanf("%c", &ch);
if (ch <= 122 && ch >= 97) {
if (!(*T = (lnode*)malloc(sizeof(lnode)))) {
//exit(OVERFLOW);
}
(*T)->c = ch;
(*T)->left = NULL;
(*T)->right = NULL;
}
else {
if (!(*T = (lnode*)malloc(sizeof(lnode)))) {
exit(OVERFLOW);
}
(*T)->c = ch;
creat2(&(*T)->left);
creat2(&(*T)->right);
}
}
由中缀表达式构建二叉树:
思路先将中缀表达式换为前缀表达式。
换为前缀表示:
typedef struct lnode {
char c;
lnode* left;
lnode* right;
}lnode, * zhi;
stack<string>z;
int index=0;//
string prefix;
int isOperator(char ch) {
//cout << ch << endl;
return (ch == '+' || ch == '-' || ch == '*' || ch == '/');
}
int getPriority(char ch) {
if (ch == '-' || ch == '+')
return 1;
else if (ch == '*' || ch == '/')
return 2;
else
return 0;//'('')';
}
string infixToPrefix(string infix) {
//string prefix;
int infixLen = infix.length();//长度
//int prefixIndex = 0;
for (int i = infixLen - 1; i >= 0; i--) {
if (infix[i] == ' ')
continue;
if (isOperator(infix[i])) {
while (!z.empty() && getPriority(z.top()[0]) > getPriority(infix[i])) {
string temp = z.top();
// cout << "+++++";
// cout << temp;
z.pop();
prefix+= temp;
}
string s(1, infix[i]);
// cout << s << endl;
z.push(s);
}
else if (infix[i] == ')') {
string s(1, infix[i]);
z.push(s);
}
else if (infix[i] == '(') {
while (!z.empty() && z.top() != ")") {
string temp = z.top();
z.pop();
prefix += temp;
}
z.pop(); // 弹出 ')'
}
else {
string s(1, infix[i]);
prefix += s;
}
}
while (!z.empty()) {
string temp = z.top();
z.pop();
prefix += temp;
}
//prefix[prefixIndex] = '\0';
reverse(prefix.begin(), prefix.end());
return prefix;
}
再根据前缀式构建:
void creat2(lnode** T) {//前缀表达式指向指针的地址,
//cout << index << endl;
//if (index < prefix.length())cout << prefix[index++] << endl;
char ch;
if (index < prefix.length())ch = prefix[index++];
else ch=' ';
//cout << ch << endl;
if ((ch <= 122 && ch >= 97)||(ch<=90&&ch>=65)) {//小写要考虑进去
if (!(*T = (lnode*)malloc(sizeof(lnode)))) {
//exit(OVERFLOW);
}
(*T)->c = ch;
(*T)->left = NULL;
(*T)->right = NULL;
}
else {
if (!(*T = (lnode*)malloc(sizeof(lnode)))) {
//exit(OVERFLOW);
}
(*T)->c = ch;
creat2(&(*T)->left);
creat2(&(*T)->right);
}
}
根据先序遍历和中序遍历构建二叉树:
用的递归的思想:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
#include<stdio.h>
using namespace std;
string s1;
string s2;
typedef struct tnode {
char data;
tnode* left;
tnode* right;
}tnode;
void creat(tnode* &T,int Xi,int Xj,int Zi,int Zj) {
//if (T == NULL)
//{
if (Xi > Xj) {
T = NULL;
return;
}
T = (tnode*)malloc(sizeof(tnode));
T->data = s1[Xi];
int k = 0;
//if (s2.find(T->data, Zi) != s2.npos) {
//k = s2.find(T->data, Zi);
//}
for (int i = Zi; i < Zj + 1; i++)
{
if (s1[Xi] == s2[i])
{
k = i;
break;
}
}
creat(T->left,Xi+1,Xi+k-Zi,Zi,k-1);
creat(T->right, Xi + k - Zi + 1, Xj, k + 1, Zj);
}
int main() {
cin >> s1 >> s2;
int Xi = 0, Zi = 0, Xj = s1.length() - 1, Zj = s2.length() - 1;
tnode* boot = NULL;
creat(boot, Xi, Xj, Zi, Zj);
cout << getdepth(boot) << endl;
cout << getleaves(boot) ;
}
构建线索二叉树: