数据结构—二叉树的非递归建立(先序和层次)和非递归遍历(四种)

  二叉树的递归建立和遍历十分简单好写,为了加深对二叉树的理解这篇文章用c++实现了二叉树的建立,遍历,以及寻找根节点和别的节点之间的路径等功能,为了实现这些功能还写了必要的栈和队列的实现。

1. 二叉树节点:

typedef struct Btnode { // 二叉树单个节点
    char data; //可以重复
    struct Btnode *rchild; //右孩子(子树)
    struct Btnode *lchild; //左孩子(子树)
    struct Btnode *Pre; //打印路径时的前驱节点,其他地方无用
    Btnode(): rchild(NULL), lchild(NULL), Pre(NULL) {} //无参构造函数

} Btnode, *Pbit;


2. 二叉树数据结构:输入方式输入一个字符串如“ABD###CE##F##”其中‘#’代表空节点,其余按照先序或者层次建立

class Binary_Tree { //二叉树数据结构
    public:
        friend class Stack;
        friend class Queue;
        void Precreate(); //建立二叉树(非递归先序)
        void Levelcreate();//建立二叉树(非递归层次)
        Binary_Tree(); //构造函数
        ~Binary_Tree(); //析构函数
        void Clear(); //清空二叉树
        Btnode *Root(); //返回根节点(root为私有, 通过该函数访问)
        void Preorder(); //前序遍历(非递归)
        void Inorder(); //中序遍历(非递归)
        void Postorder(); //后序遍历(非递归)
        void Levelorder(); //层次遍历
        void Path(Btnode *);//打印给定节点到根节点的路径
        void Print_Path(Pbit*, int); //打印缓冲区buff中所有节点到根节点路径
        Pbit* Find(char m, int&); //寻找data为该参数的所有节点,并将其
        //依次存入缓冲区buff中
    private:
        Btnode *root; //根节点

};//ABD###CE##F##


3. 栈的实现: 因为在二叉树非递归建树(先序)和先序中序后序遍历时必须利用栈,而作为数据结构的学习,用stl模板库倒不如自己实现,所以本文附上栈和队列的实现,这里栈利用顺序存储实现。

typedef Pbit Stype;

class Stack { //栈 顺序存储实现(数组)
    public:
        friend class Binary_Tree;
        Stack(); 
        ~Stack();
        void Clear(); //清空
        void Push(Stype); //压栈
        Stype Pop(); //出栈
        Stype Top(); // 返回栈顶元素
        bool Empty(); //判断栈是否为空
        int Size(); // 长度
    private:
        Stype *s;
        int top; //栈顶
        int Maxsize; //动态分配最大长度

};


Stack:: Stack()
{
    top = 0;
    Maxsize = Addsize;
    s = new Stype[Addsize];
}


Stack:: ~Stack()
{
    Clear();
}


void Stack:: Clear()
{
    delete []s;
}


void Stack:: Push(Stype Data)//入栈
{
    if(top >= Maxsize)//栈空间不够的话补空间
    {
        realloc(s, (Maxsize + Addsize) * sizeof(Stype));
    }
    s[top++] = Data;
}


Stype Stack:: Pop()//出栈
{
    if(Empty())
    {
        printf("栈为空\n");
        return NULL;
    }
    return s[--top];
}


Stype Stack:: Top()//返回栈顶元素
{
    return s[top - 1];
}


bool Stack:: Empty()//检查栈是否为空
{
    if(top == 0) return true;
    return false;
}


int Stack:: Size()//返回栈的长度
{
    return top;

}


4. 队列的实现:在求路径,查找,层次遍历时需用到队列,在这里用双向链表实现队列。

typedef Pbit Qtype;

class Queue { //队列,双向链表(链式存储实现)
    public:
        friend class Binary_Tree;
        Queue();
        ~Queue();
        void Clear();
        void Push(Qtype);
        Qtype Pop();
        Qtype Top();
        bool Empty();
        int Size();
    private:
        Qnode *Front; //队首指针
        Qnod

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值