文章目录
头文件
使用node 定义节点,并重命名为
BTNode
。二叉树类BTree
中含有一个成员BTNode* head;
存放二叉树的头节点。
typedef int ElemType;
const int MaxSize = 20;
//二叉树链式存储结构
typedef struct node {
ElemType data;
struct node* lchild;
struct node* rchild;
}BTNode;
class BTree {
BTNode* head;
public:
BTree() {
head = new BTNode; };
BTree(const char* str);
void CreateBTNode(const char* str);////创建二叉树(对于括号表示法)
void DispBTree();//输出二叉树
BTNode* FindNode(ElemType x);//查找节点
//查找左右孩子节点
BTNode* LchildNode(BTNode* b);
BTNode* RchildNode(BTNode* b);
//求树高
int BTreeHeight();
//递归遍历
void PreOrder();//先序遍历
void InOrder();//中序遍历
void PostOrder();//后序遍历
//非递归遍历
void PreOrder1();//先序遍历
void InOrder1();//中序遍历
void PostOrder1();//后序遍历
void LevelOrder();//层次遍历
//构造二叉树
BTNode* preInCreate(char* pre, char* in, int n);//前序和中序
BTNode* postInCreate(char* post, char* in, int n);//前序和后序
public:
BTNode* getHead() {
return head;
}
void setHead(BTNode* _head) {
head = _head;
}
void DispBTree(BTNode* b);//输出二叉树
private:
void AllPath1(BTNode* b);//P181
BTNode* FindNode(BTNode *b,ElemType x);//查找节点
int BTreeHeight(BTNode *b);
void PreOrder(BTNode* b);//先序遍历
void InOrder(BTNode* b);//中序遍历
void PostOrder(BTNode* b);//后序遍历
};
成员函数
构造函数
两个构造函数:一个无参构造,只为头节点开辟空间。一个有参构造,传入一个以括号表示法表示的树的
const char*
字符串对象。
BTree::BTree(const char* str) {
CreateBTNode(str);
}
创建二叉树CreateBTNode
使用
void CreateBTNode(const char* str);
方法创建。
创建过程使用栈作为辅助,对于一个合法的字符串,遍历其中所有元素,如果遇到一个节点元素(default部分),初始化节点,若该节点作为头节点,则执行this->head = p;
,若不是头节点,通过k
判断该节点作为栈顶元素的左孩子节点或者右孩子节点。如果遇到(
,此时p
已经被赋值,其值为上一个遍历到的节点元素,(
表明该节点p
将作为之后节点的父节点,将p
进栈,并将k
置为1。如果遇到,
,表明某个节点的左子树处理完,将要处理右孩子。如果遇到)
,表明当前栈顶元素的孩子节点已经处理完,将其出栈。
void BTree::CreateBTNode(const char* str) {
BTNode* St[MaxSize], * p = NULL;
int top = -1;//栈顶元素下标
int k = 1;//标记当前处理的是左子树还是右子树
int j = 0;//作为遍历str时的下表
char ch; //存储每次取出的一个字符
this-<