表达式树

```PTree CreatExpTree()
{
char data;
PTree T;
Pstack P = CreatStack();

cout << "请输入后缀表达式：(换行输入ctrl+z结束输入)";
while (cin >> data)
{
if ('a'<= data && 'z' >= data)
{
T = (PTree)malloc(sizeof(Tree));
T->data = data;
T->left = NULL;
T->right = NULL;
Push(P, T);
}
else
{
T = (PTree)malloc(sizeof(Tree));
T->data = data;
T->right = Pop(P);
T->left = Pop(P);
Push(P, T);
}
}
return Pop(P);    //返回树的根节点
}```

```void InorderTraversal(PTree T)
{
//递归真好用
if (T)
{
if (T->left)		//如果有左子树，说明不是叶节点，应该输出一个左括号
{
cout << '(';
}
InorderTraversal(T->left);
cout << T->data;
InorderTraversal(T->right);
if (T->right)		//如果有右子树，说明不是叶节点，应该输出一个右括号
{
cout << ')';
}
}
}```

exptree.h文件

```#ifndef EXPTREE
#define EXPTREE

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

typedef struct ExpTree Tree;
typedef Tree * PTree;
typedef char ElementType;
struct ExpTree
{
ElementType data;
PTree left;
PTree right;
};
PTree CreatExpTree();
void PostorderTraversal(PTree T);
void InorderTraversal(PTree T);

#endif // !EXPTREE```

stack.h文件

```#ifndef STACK
#define STACK

#include"exptree.h"
typedef struct StackNode stack;
typedef stack * Pstack;

struct StackNode
{
PTree data;
Pstack next;
};
Pstack CreatStack();
void Push(Pstack P,PTree T);
PTree Pop(Pstack P);

#endif // !STACK```

main.cpp文件

```#include "stack.h"

int main()
{
PTree ET;
ET = CreatExpTree();
cout << "中序遍历结果(中缀表达式)：";
InorderTraversal(ET);
cout << endl;
cout << "后序遍历结果：";
PostorderTraversal(ET);
cout << endl;
system("pause");
return 0;
}```

stack.cpp文件

```#include "stack.h"

Pstack CreatStack()
{
Pstack P = (Pstack)malloc(sizeof(stack));
if (P)
{
P->next = NULL;
return P;
}
else
{
return NULL;
}
}

void Push(Pstack P, PTree T)
{
Pstack temp = (Pstack)malloc(sizeof(stack));
temp->data = T;
temp->next = P->next;
P->next = temp;
}

PTree Pop(Pstack P)
{
Pstack temp;
PTree T = (PTree)malloc(sizeof(Tree));
temp = P->next;
P->next = P->next->next;
T->data = temp->data->data;
T->left = temp->data->left;
T->right = temp->data->right;
free(temp);

return T;
}```

exptree.cpp文件

```#include "exptree.h"
#include "stack.h"
PTree CreatExpTree()
{
char data;
PTree T;
Pstack P = CreatStack();

cout << "请输入后缀表达式：(换行输入ctrl+z结束输入)";
while (cin >> data)
{
if ('a'<= data && 'z' >= data)
{
T = (PTree)malloc(sizeof(Tree));
T->data = data;
T->left = NULL;
T->right = NULL;
Push(P, T);
}
else
{
T = (PTree)malloc(sizeof(Tree));
T->data = data;
T->right = Pop(P);
T->left = Pop(P);
Push(P, T);
}
}
return Pop(P);
}

void PostorderTraversal(PTree T)
{
if (T)
{
PostorderTraversal(T->left);
PostorderTraversal(T->right);
cout << T->data;
}
}

void InorderTraversal(PTree T)
{
//递归真好用
if (T)
{
if (T->left)		//如果有左子树，说明不是叶节点，应该输出一个左括号
{
cout << '(';
}
InorderTraversal(T->left);
cout << T->data;
InorderTraversal(T->right);
if (T->right)		//如果有右子树，说明不是叶节点，应该输出一个右括号
{
cout << ')';
}
}
}```

0 条评论

• C++之类（一）

在C++之中，我们使用类来定义自己的数据类型。通过自定义数据类型，可以使我们的编程变得更加方便。或者说C++设计类的目的就是为了使我们可以像使用基本数据类型一样...

• C++之运算符重载（二）

https://blog.csdn.net/zy010101/article/details/105240318

• C++之覆盖

在继承中，C++允许子类的成员和父类同名。此时，子类的同名成员会覆盖父类的同名成员。如果想使用父类的同名成员，需要使用类名＋作用域运算符。下面这段代码演示了如何...

• Motion Selective Prediction for Video Frame Synthesis

https://www.arxiv-vanity.com/papers/1812.10157/

• TensorFlow学习笔记--CIFAR-10 图像识别

是用于普通物体识别的小型数据集，一共包含 10个类别 的 RGB彩色图片（包含：（飞机、汽车、鸟类、猫、鹿、狗、蛙、马、船、卡车）。图片大小均为 3232像素*...

• Motion Selective Prediction for Video Frame Synthesis

https://www.arxiv-vanity.com/papers/1812.10157/

• Segment Routing 在大规模数据中的应用(上）

在写《BGP在大规模数据中心中的应用》里当时就有了讨论Segment Routing(SR)的想法，因为当时我还在参与MPLS+SR的白皮书测试，得到了不少真实...