二叉树

作者: Vsion8980 | 来源:发表于2019-11-14 12:26 被阅读0次

baseFunc.h


#include <iostream>
using namespace std;
#define ElementType int
#define QElementType BiTree


typedef struct BiTNode{
    ElementType data;
    struct BiTNode *lchild,*rchild;
}*BiTree;

typedef struct PtrStack{
    BiTree *top;
    BiTree *base;
    int length;
}*Stack;

typedef struct QueueNode{
    struct QueueNode *next;
    QElementType data;
}*LNode;
typedef struct circleQueue{
    QueueNode *front,*rear;
}LQueue;

//链栈操作
void initLinkStack(Stack &S);
void Push(Stack &S,BiTree x);
void Pop(Stack &S,BiTree &x);
void getTop(Stack S,BiTree &x);
bool isEmpty(Stack S);


//队列操作
void initQueue(LQueue &Q);
void EnQueue(LQueue &Q,BiTree T);
void DeQueue(LQueue &Q,BiTree &T);
bool isEmpty(LQueue Q);



//二叉树操作
bool CreateBiTree(BiTree &T);
void PreOrder(BiTree T);
void Inorder(BiTree T);
void Postorder(BiTree T);
void Preorder2(BiTree T);
void Inorder2(BiTree T);
void Postorder2(BiTree T);
void Levelorder(BiTree T);

baseFunc.cpp


//
// Created by Vsion on 2019/11/6.
//

#include "header/baseFunc.h"



bool  CreateBiTree(BiTree &T)
{
    int ch;
    cout<<"先序输入字符"<<endl;
    cin>>ch;
    if(ch == 0)  T = nullptr;
    else
    {
        if(! (T = (BiTNode*) malloc (sizeof(BiTNode))))   return false;
        T->data = ch;
        CreateBiTree(T->lchild) ;
        CreateBiTree(T->rchild) ;
    }
    return true;
}

void PreOrder(BiTree T){
    if (T){
        cout<<T->data<<endl;
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}
void Inorder(BiTree T){
    if (T){
        Inorder(T->lchild);
        cout<<T->data<<endl;
        Inorder(T->rchild);
    }
}

void Postorder(BiTree T){
    if (T){
        Postorder(T->lchild);
        Postorder(T->rchild);
        cout<<T->data<<endl;
    }
}
void Preorder2(BiTree T){
    Stack S;
    S = new PtrStack;
    initLinkStack(S);
    BiTree p = T;
    while (p||!isEmpty(S)){
        if (p){
            cout<<p->data<<endl;
            Push(S,p);
            p = p->lchild;
        }else{
            Pop(S,p);
            p = p->rchild;
        }
    }
}
void Inorder2(BiTree T){
    Stack S;
    S = new PtrStack;
    initLinkStack(S);
    BiTree p = T;
    while (p||!isEmpty(S)){
        if (p){
            Push(S,p);
            p = p->lchild;
        }
        else{
            Pop(S,p);
            cout<<p->data;
            p = p->rchild;
        }
    }
}
void Postorder2(BiTree T){
    Stack S;
    BiTree r;
    S = new PtrStack;
    initLinkStack(S);
    BiTree p = T;
    while (p||!isEmpty(S)){
        if (p){
            Push(S,p);
            p = p->lchild;
        }else{
            getTop(S,p);
            if (p->rchild&&p->rchild!=r){
                p = p->rchild;
                Push(S,p);
                p = p->lchild;
            }else{
                Pop(S,p);
                cout<<p->data<<endl;
                r = p;
                p = nullptr;
            }
        }
    }
}
void Levelorder(BiTree T){

    LQueue Q;
    initQueue(Q);
    BiTree p;
    EnQueue(Q,T);
    while(!isEmpty(Q)){
        DeQueue(Q,p);
        cout<<p->data<<endl;
        if (p->lchild) EnQueue(Q,p->lchild);
        if (p->rchild) EnQueue(Q,p->rchild);

    }

}

void initLinkStack(Stack &S){
    S->base = new BiTree;
    S->top = S->base;
    S->length = 0;
}
void Push(Stack &S,BiTree x){
    *S->top++ = x;
    S->length++;
}
void Pop(Stack &S,BiTree &x){
    x = *--S->top;
    S->length--;
}
void getTop(Stack S,BiTree &x){
    x = *--S->top;
    S->top++;
}

bool isEmpty(Stack S){
    return S->length <= 0;
}




void initQueue(LQueue &Q){
    Q.front = Q.rear = new QueueNode;
    Q.front->next = nullptr;
}
void EnQueue(LQueue &Q,QElementType data){
    LNode p;
    p = new QueueNode;
    p->data = data;
    p->next = nullptr;
    Q.rear->next = p;
    Q.rear = p;
}
void DeQueue(LQueue &Q,QElementType &x){
    LNode p;
    p = new QueueNode;
    p = Q.front->next;
    x = p->data;

    Q.front->next = p->next;

    if (Q.rear == p) Q.rear = Q.front;
    delete p;
}
bool isEmpty(LQueue Q){
    return Q.front == Q.rear;
}

相关文章

  • 数据结构与算法-二叉树02

    二叉树的定义 二叉树的特点 二叉树的五中基本形态 其他二叉树 斜二叉树 满二叉树 完全二叉树图片.png满二叉树一...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 树与二叉树

    **树 ** 二叉树 满二叉树 完全二叉树 三种遍历方法 树与二叉树的区别 二叉查找树 平衡二叉树 红黑二叉树

  • 二叉树的宽度优先搜索(层次遍历,BFS)

    二叉树结构: 二叉树宽度优先搜索: 按照二叉树的层数依次从左到右访问二叉树的节点;例如:给定一个二叉树: 按照宽度...

  • 剑指 offer:39、平衡二叉树

    39. 平衡二叉树 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路: 平衡二叉树:Wiki:在...

  • Algorithm小白入门 -- 二叉树

    二叉树二叉树构造二叉树寻找重复子树 1. 二叉树 基本二叉树节点如下: 很多经典算法,比如回溯、动态规划、分治算法...

  • 14-树&二叉树&真二叉树&满二叉树

    一、树 二、二叉树 三、真二叉树 四、满二叉树

  • 二叉树的应用

    完美二叉树(满二叉树) 除了最下一层的节点外,每层节点都有两个子节点的二叉树为满二叉树 完全二叉树 除二叉树最后一...

  • 12.树Tree(2)

    目录:1.二叉树的基本概念2.二叉树的性质3.二叉树的创建4.二叉树的遍历 1.二叉树的基本概念 2.二叉树的性质...

网友评论

      本文标题:二叉树

      本文链接:https://www.haomeiwen.com/subject/akcrictx.html