C++__二叉树(练习)

二叉树

文件结构:二叉树→TREE→TREE.h、TREE.cpp

        →QUEUE→QUEUE.h、QUEUE.cpp

        →main.cpp



queue.h

#ifndef QUEUE_H_
#define QUEUE_H_

#define SIZE 4

typedef int data_type;

enum QUEUE_OP {
    QUEUE_ERR = -1, QUEUE_OK, QUEUE_EMPTY
};

class QUEUE {
private:
    data_type *data;
    int count;
    int iFront;
    int iRear;
public:
    QUEUE();
    ~QUEUE();

    int getCount() const;
    data_type getData(unsigned int i) const;
    data_type *getData() const;
    int getFront() const;
    int getRear() const;
    void setCount(int count);
    void setData(data_type data, unsigned int i);
    void setData(data_type *data);
    void setFront(int front);
    void setRear(int rear);

//    QUEUE *Create();
//    void Destroy(QUEUE *pQueue);
    int EnQueue(QUEUE *pQueue, data_type tData);
    int DeQueue(QUEUE *pQueue, data_type *pData);
    int IsEmpty(QUEUE *pQueue);
    void operator delete(void *pQueue);
};

#endif /* QUEUE_H_ */

queue.cpp

#include "QUEUE.h"
#include <iostream>
using namespace std;

QUEUE::QUEUE() {
    // TODO Auto-generated constructor stub
    cout<<"queue"<<endl;
    this->setCount(0);
    this->setFront(0);
    this->setRear(0);
    int *data = new data_type[SIZE];
    if (!data) {
        cout << "new data[SIZE] error" << endl;
        this->setData(NULL);
    } else {
        this->setData(new data_type[SIZE]);
    }
}

QUEUE::~QUEUE() {
    // TODO Auto-generated destructor stub
    cout<<"~queue"<<endl;
}

int QUEUE::getCount() const {
    return count;
}

data_type QUEUE::getData(unsigned int i) const {
    return data[i];
}

data_type *QUEUE::getData() const {
    return data;
}

int QUEUE::getFront() const {
    return iFront;
}

int QUEUE::getRear() const {
    return iRear;
}

void QUEUE::setCount(int count) {
    this->count = count;
}

void QUEUE::setData(data_type data, unsigned int i) {
    this->data[i] = data;
}

void QUEUE::setData(data_type *data) {
    this->data = data;
}

void QUEUE::setFront(int front) {
    iFront = front;
}

void QUEUE::setRear(int rear) {
    iRear = rear;
}

int QUEUE::EnQueue(QUEUE *pQueue, data_type tData) {
    if (!pQueue)
        return QUEUE_ERR;

    if (SIZE == pQueue->getCount()) {
        cout << "queue en over" << endl;
        return QUEUE_ERR;
    }
    pQueue->setData(tData, pQueue->getRear());
    pQueue->setRear(pQueue->getRear() + 1);
    if(SIZE == pQueue->getRear())
        pQueue->setRear(0);
    pQueue->setCount(pQueue->getCount() + 1);

    return QUEUE_OK;
}

int QUEUE::DeQueue(QUEUE *pQueue, data_type *pData) {
    if ((!pQueue) || (!pData))
        return QUEUE_ERR;

    if (0 == pQueue->getCount()) {
        cout << "queue de over" << endl;
        return QUEUE_ERR;
    }
    *pData = pQueue->getData(pQueue->getFront());
    pQueue->setFront(pQueue->getFront() + 1);
    if(SIZE == pQueue->getFront())
        pQueue->setFront(0);
    pQueue->setCount(pQueue->getCount() - 1);

    return QUEUE_OK;
}

int QUEUE::IsEmpty(QUEUE *pQueue) {
    if(!pQueue)
        return QUEUE_ERR;

    if(0 == pQueue->getCount())
        return QUEUE_EMPTY;

    return QUEUE_OK;
}

void QUEUE::operator delete(void *pQueue){
    if(!pQueue)
        return;

    data_type *Tmp = ((QUEUE *)pQueue)->getData();
    free(Tmp);
    free(pQueue);

    return;
}

tree.h

#ifndef TREE_H_
#define TREE_H_

typedef int data_type;

enum TREE_OP {
    TREE_ERR = -1, TREE_OK
};

class TREE {
private:
    TREE *left;
    data_type data;
    TREE *right;
public:
    TREE(data_type data);
    ~TREE();

    data_type getData() const;
    TREE *getLeft() const;
    TREE *getRight() const;
    void setData(data_type data);
    void setLeft(TREE *left);
    void setRight(TREE *right);

    int Create(TREE *pRoot, data_type data);
    void PreOrder(TREE *pRoot);
    void InOrder(TREE *pRoot);
    void PostOrder(TREE *pRoot);
    void NoOrder(TREE *pRoot);
    void operator delete(void *pRoot);
};

#endif /* TREE_H_ */

tree.cpp

#include "TREE.h"
#include "../QUEUE/QUEUE.h"
#include <iostream>
using namespace std;

TREE::TREE(data_type data) {
    // TODO Auto-generated constructor stub
    this->setData(data);
    this->setLeft(NULL);
    this->setRight(NULL);
}

TREE::~TREE() {
    // TODO Auto-generated destructor stub

}

data_type TREE::getData() const {
    return data;
}

TREE *TREE::getLeft() const {
    return left;
}

TREE *TREE::getRight() const {
    return right;
}

void TREE::setData(data_type data) {
    this->data = data;
}

void TREE::setLeft(TREE *left) {
    this->left = left;
}

void TREE::setRight(TREE *right) {
    this->right = right;
}

int TREE::Create(TREE *pRoot, data_type data) {
    if (!pRoot)
        return TREE_ERR;

    TREE *New = new TREE(data);
    if (!New) {
        cout << "new New error" << endl;
        return TREE_ERR;
    }
    TREE *Tmp = pRoot;
    while (1) {
        if (New->getData() > Tmp->getData()) {
            if (!Tmp->getRight()) {
                Tmp->setRight(New);
                break;
            } else {
                Tmp = Tmp->getRight();
            }
        } else {
            if (!Tmp->getLeft()) {
                Tmp->setLeft(New);
                break;
            } else {
                Tmp = Tmp->getLeft();
            }
        }
    }

    return TREE_OK;
}

void TREE::PreOrder(TREE *pRoot) {
    if (!pRoot)
        return;

    cout << pRoot->getData() << "  ";
    pRoot->PreOrder(pRoot->getLeft());
    pRoot->PreOrder(pRoot->getRight());
//    cout << endl;

    return;
}

void TREE::InOrder(TREE *pRoot) {
    if (!pRoot)
        return;

    pRoot->InOrder(pRoot->getLeft());
    cout << pRoot->getData() << "  ";
    pRoot->InOrder(pRoot->getRight());
//    cout << endl;

    return;
}

void TREE::PostOrder(TREE *pRoot) {
    if (!pRoot)
        return;

    pRoot->PostOrder(pRoot->getLeft());
    pRoot->PostOrder(pRoot->getRight());
    cout << pRoot->getData() << "  "; //<< endl;

    return;
}

void TREE::NoOrder(TREE *pRoot) {
    if (!pRoot)
        return;

    data_type data;
    TREE *Tmp = NULL;
    QUEUE *pQueue = new QUEUE;
    if (!pQueue) {
        cout << "new queue error" << endl;
        return;
    }
    if (QUEUE_OK != pQueue->EnQueue(pQueue, (data_type) pRoot)) {
        cout << "en tree error" << endl;
        return;
    }
    while (QUEUE_OK == pQueue->IsEmpty(pQueue)) {
        if (QUEUE_OK != pQueue->DeQueue(pQueue, &data)) {
            cout << "de tree error" << endl;
            break;
        }
        Tmp = (TREE *) data;
        cout << Tmp->getData() << "  ";
        if (Tmp->getLeft()) {
            pQueue->EnQueue(pQueue, (data_type) Tmp->getLeft());
        }
        if (Tmp->getRight()) {
            pQueue->EnQueue(pQueue, (data_type) Tmp->getRight());
        }
    }
    cout << endl;
    delete pQueue;

    return;
}

void TREE::operator delete(void *pRoot) {
    if (!pRoot)
        return;

    delete ((TREE *) pRoot)->getLeft();
    delete ((TREE *) pRoot)->getRight();
    free(pRoot);

    return;
}

main.cpp

#include "TREE/TREE.h"
#include "QUEUE/QUEUE.h"
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;

void function() {

    srand((unsigned int)time(NULL));
    int i = rand() % 100;
    cout<<i<<"  ";
    TREE *pRoot = new TREE(i);
    if (!pRoot) {
        cout << "new root error" << endl;
        return;
    }
    int *data = new int[10];
    i = 10;
    while (i--) {
        data[i] = rand() % 100;
        pRoot->Create(pRoot, data[i]);
        cout << data[i] << "  ";
    }
    cout << endl;

    pRoot->PreOrder(pRoot);cout << endl;
    pRoot->InOrder(pRoot);cout << endl;
    pRoot->PostOrder(pRoot);cout << endl;
    pRoot->NoOrder(pRoot);
    delete pRoot;
}

int main() {
    function();
    return 0;
}
时间: 2024-10-11 02:53:08

C++__二叉树(练习)的相关文章

数据结构第二单元练习题答案

数据结构第二单元练习题答案 一.选择 1.树最适合用来表示(  ) A.有序数据元素      B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 2.在下述结论中,正确的是(  ) ①只有一个结点的二叉树的度为0;  ②二叉树的度为2:  ③二叉树的左右子树可任意交换; ④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树. A.①②③     B.②③④    C.②④     D.①④ 3.以下说法正确的是(  ) A.任何一棵二叉树中至少有一个结点的度

C 封装一个简单二叉树基库

引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷酷现实的打击:这种打击常无情地加诸于每个脱离现实环境生活的  人.或许高斯讲求实效和追求完美的性格,有助于让他抓住生活中的简单现实.  高斯22岁获博士学位,25岁当选圣彼德堡科学院外籍院士,30岁任哥廷根大学数  学教授兼天文台台长.虽说高斯不喜欢浮华荣耀,但在他成名后的五十年间,这  些东西就像

二叉树学习笔记之树的旋转

树旋转(Tree rotation)是二叉树中的一种子树调整操作,每一次旋转并不影响对该二叉树进行中序遍历的结果.树旋转通常应用于需要调整树的局部平衡性的场合. >>左旋和右旋 树的旋转有两种基本的操作,即左旋(逆时针方向旋转)和右旋(顺时针方向旋转). 树旋转包括两个不同的方式,分别是左旋转(以P为转轴)和右旋转(以Q为转轴).两种旋转呈镜像,而且互为逆操作. 下图示意了两种树旋转过程中, 子树的初态和终态 +---+ +---+ | Q | | P | +---+ +---+ / \ ri

算法导论第十二章__二叉搜索数

package I第12章__二叉搜索树; //普通二叉树 public class BinaryTree<T> { // -----------------------数据结构--------------------------------- private int height = 0; private Node<T> rootNode; class Node<T> { T t; int key; Node left; Node right; public Node

Python与数据结构[3] -&gt; 树/Tree[0] -&gt; 二叉树及遍历二叉树的 Python 实现

二叉树 / Binary Tree 二叉树是树结构的一种,但二叉树的每一个节点都最多只能有两个子节点. Binary Tree: 00 |_____ | | 00 00 |__ |__ | | | | 00 00 00 00 对于二叉树的遍历,主要有以下三种基本遍历方式: 先序遍历:先显示节点值,再显示左子树和右子树 中序遍历:先显示左子树,再显示节点值和右子树 后序遍历:先显示左子树和右子树,再显示节点值 下面将用代码构建一个二叉树,并实现三种遍历方式, 完整代码 1 class TreeNo

【算法日常】二叉树的层级遍历

二叉树的层次遍历 题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal 题解: 本题有两种解法,首先第一种肯定是非常明显的广度优先遍历,另一种深度优先遍历的解法. 第一种: 广度优先遍历 广度优先遍历,将遍历的每层的结果放入一个列表中, 该层遍历结束,将整个结果列表加入到总的结果中即可.时间复杂度 O(n) 空间复杂度 O(1)(结果的存储空间若不进行计算的话) 代码如下: i

C#实现二叉树的遍历

C#实现二叉树的前序.中序.后序遍历. public class BinaryTreeNode     {         int value;         BinaryTreeNode left;         BinaryTreeNode right;         /// <summary>         /// 前序遍历         /// </summary>         /// <param name="tree">&l

【树4】二叉树的遍历

简介 遍历二叉树就是按照某种顺序,将树中的结点都枚举一遍,且每个结点仅仅访问一次.因为树不是线性的结构,遍历不像线性表那样简单,因此他的遍历需要特点的算法来完成. 从某种角度讲,对二叉树的遍历就是将树形结构转换为线性结构的操作. 二叉树的遍历方法主要有如下几种: 先序遍历:先访问root结点,再先序遍历左子树,再先序遍历右子树. 中序遍历:先中序遍历左子树,再访问root结点,再中序遍历右子树. 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问root结点. 层遍历:从上到下,从左到右,一层

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect