#include <stdio.h> #include<iostream> #include<stdlib.h> #include<stdio.h> #define MAXSIZE 20 using namespace std; struct BiTreeNode//二叉树结点定义 { BiTreeNode* LChild;//左孩子指针域 int data; BiTreeNode* RChild;//右孩子指针域 }; struct Stack//栈的定义 { int base;//栈底指针 int top;//栈顶指针 BiTreeNode BTNS[MAXSIZE];//二叉树结点数组 int stackSize;//栈可用的最大容量 }; void InitStack(Stack*& S)//初始化栈 { S = (Stack*)malloc(sizeof(Stack)); S->top = S->base = 0; S->stackSize = MAXSIZE; } bool StackEmpty(Stack*& S)//判断栈是否为空 { if (S->base == S->top) { return true; } else { return false; } } bool StackFull(Stack*& S)//判断栈是否已满 { if (S->top - S->base == S->stackSize) { //栈已满 return true; } else { //栈不满 return false; } } void Push(Stack*& S, BiTreeNode*& T)//元素入栈 { if (StackFull(S) == true) { //如果栈已满, 则直接返回 return; } S->BTNS[S->top].data = T->data; S->BTNS[S->top].LChild = T->LChild; S->BTNS[S->top].RChild = T->RChild; S->top++; } BiTreeNode* Pop(Stack*& S)//元素出栈 { if (StackEmpty(S) == true) { return NULL; } S->top--; return &(S->BTNS[S->top]); } // void CreateBiTree(BiTreeNode*& T)//以先序序列创建二叉树 { char ch; cin >> ch; if (ch != '#') { T = (BiTreeNode*)malloc(sizeof(BiTreeNode)); T->data = ch; CreateBiTree(T->LChild); CreateBiTree(T->RChild); } else { T = NULL; } } void InOrderTraverse(Stack*& S, BiTreeNode*& T)//中序遍历二叉树的非递归算法(※) { InitStack(S);//初始化栈 BiTreeNode* p = T; BiTreeNode* q; while (p || !StackEmpty(S)) { if (p) { Push(S, p); p = p->LChild; } else { q = Pop(S);//出栈元素指针保存在q中 putchar(q->data); cout << " "; p = q->RChild; } } } int main() { Stack* S; BiTreeNode* T; CreateBiTree(T); InOrderTraverse(S, T); return 0; }请帮我把代码优化一下
时间: 2024-03-14 07:46:07 浏览: 17
以下是优化后的代码:
```cpp
#include <iostream>
#include <stack>
using namespace std;
struct BiTreeNode { // 二叉树结点定义
BiTreeNode* LChild; // 左孩子指针域
char data;
BiTreeNode* RChild; // 右孩子指针域
};
void CreateBiTree(BiTreeNode*& T) { // 以先序序列创建二叉树
char ch;
cin >> ch;
if (ch == '#') {
T = NULL;
} else {
T = new BiTreeNode;
T->data = ch;
CreateBiTree(T->LChild);
CreateBiTree(T->RChild);
}
}
void InOrderTraverse(BiTreeNode* T) { // 中序遍历二叉树的非递归算法
stack<BiTreeNode*> S; // 栈的定义
BiTreeNode* p = T;
while (p || !S.empty()) {
if (p) {
S.push(p);
p = p->LChild;
} else {
p = S.top();
S.pop();
cout << p->data << " ";
p = p->RChild;
}
}
}
int main() {
BiTreeNode* T;
CreateBiTree(T);
InOrderTraverse(T);
return 0;
}
```
优化后的代码:
1. 使用 `<stack>` 标准库代替手写栈,使代码更简洁、易读。
2. 去除了不必要的头文件和宏定义。
3. 将函数 `InitStack`、`StackEmpty`、`StackFull`、`Push`、`Pop` 和结构体 `Stack` 去除,简化了代码结构。
4. 在 `CreateBiTree` 函数中,使用 `new` 关键字代替 `malloc` 函数,使代码更易读、易用。
5. 在 `InOrderTraverse` 函数中,去除了对 `Stack` 结构体的依赖,使代码更简洁、易读。