C++ 线索二叉树

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 &
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值