TreadTree.h
#ifndef TreadTree_h
#define TreadTree_h
#include <iostream>
#include <stack>
using namespace std;
/*
ltag = 0 //lchild指向节点的左孩子
ltag = 1 //lchild指向节点的前驱节点
rtag = 0 //rchild指向节点的右孩子
rtag = 1 //rchild指向节点的后继节点
*/
struct ThreadNode { // 线索二叉树的结点类
int ltag, rtag; // 线索标志
ThreadNode *leftChild, *rightChild; // 线索或子女指针
char data;
};
class ThreadTree {
public:
ThreadTree():root(NULL){} // 构造函数:构造空树
void CreateBinTree(); // 建立二叉树
void BinTreeInOrder(); // 二叉树中序遍历
void CreateInThread(); // 中序遍历建立线索二叉树
ThreadNode *First(ThreadNode *current); // 返回以current作为根的中序线索二叉树中中序序列下的第一个结点
ThreadNode *Last(ThreadNode *current); // 返回以current作为根的中序线索二叉树中中序序列下的最后一个结点
ThreadNode *Next(ThreadNode *current); // 寻找结点在中序下的后继结点
ThreadNode *Prior(ThreadNode *current); // 寻找结点在中序下的前驱结点
ThreadNode *Parent(ThreadNode *t); // 寻找结点t的父结点
void PreOrder(); // 在中序线索二叉树上实现前序遍历
void InOrder(); // 在中序线索二叉树上实现中序遍历
void PostOrder(); // 在中序线索二叉树上实现后序遍历
private:
ThreadNode *root; // 树的根指针
void BinTreeInOrder(ThreadNode *current); // 递归中序遍历二叉树
void CreateInThread(ThreadNode *current, ThreadNode *&pre); // 建立中序线索二叉树
};
// 建立中序二叉树:A(B(,D),C(E,))#
void ThreadTree::CreateBinTree() {
stack<ThreadNode*> s; // 栈
int k = 1; // 用k作为处理左、右子树标记
ThreadNode *newNode, *current;
char ch; // 存储输入的字符
while(cin >> ch && ch != '#') { // 逐个字符处理
switch(ch) {
case '(':
s.push(newNode);
k = 1; // 进入子树
break;
case ')':
s.pop(); // 退出子树
break;
case ',':
k = 2;
break;
default: // 大写英文字母
newNode = new ThreadNode(); // 建立新结点
newNode->data = ch;
newNode->ltag &