zoukankan      html  css  js  c++  java
  • 数据结构(5) -- 二叉树

    //BinaryTree.h
    #ifndef BINARYTREE_H_
    #define BINARYTREE_H_
    #define ElemType int
    #define MAXSIZE 100
    
    typedef struct _TreeNode
    {
        ElemType data;  //存储的数据
        _TreeNode* left;
        _TreeNode* right;
    }TreeNode;
    
    class BinaryTree
    {
    private:
        TreeNode *root;
    public:
        BinaryTree(ElemType d);   //创建一个值为d的根节点
        ~BinaryTree();
        TreeNode* GetRoot()
        {
            return root;
        }
        //添加二叉树节点
        void InsertNodeAsL(TreeNode *p, ElemType e); //作为当前节点的左孩子插入新节点
        void InsertNodeAsR(TreeNode *p, ElemType e); //作为当前节点的右孩子插入新节点
        //清空二叉树所有节点
        void ClearTreeNode(TreeNode *ps);
        //遍历二叉树
        void PreOrder(TreeNode *p);  //先序遍历
        void CenOrder(TreeNode *p);  //中序遍历
        void LasOrder(TreeNode *p);  //后序遍历
        void Trave(TreeNode *p);     //层次遍历
        //二叉树深度
        int Deepth(TreeNode *p);
        bool Empty();     //是否为空树
    };
    
    #endif
    
    
    //BinaryTree.cpp
    #include "BinaryTree.h"
    #include <queue>
    #include <iostream>
    using namespace std;
    
    BinaryTree::BinaryTree(ElemType d)
    {
        root = new TreeNode();
        root->data = d;
        root->left = NULL;
        root->right = NULL;
    }
    
    BinaryTree::~BinaryTree()
    {
        ClearTreeNode(root);
    }
    
    //添加二叉树节点
    void BinaryTree::InsertNodeAsL(TreeNode *p, ElemType e)
    {
        TreeNode *s = new TreeNode();
        s->data = e;
        s->left = NULL;
        s->right = NULL;
        p->left = s;
    }
    
    //遍历二叉树
    void BinaryTree::InsertNodeAsR(TreeNode *p, ElemType e)
    {
        TreeNode *s = new TreeNode();
        s->data = e;
        s->left = NULL;
        s->right = NULL;
        p->right = s;
    }
    void BinaryTree::ClearTreeNode(TreeNode *p)
    {
        while (p)
        {
            ClearTreeNode(p->left);
            ClearTreeNode(p->right);
            delete p;    //释放当前节点
         }
    }
    
    //遍历二叉树
    void BinaryTree::PreOrder(TreeNode *p)
    {
        if (p == NULL)
            return;
        std::cout << p->data << " ";
        PreOrder(p->left);
        PreOrder(p->right);
    }
    
    void BinaryTree::CenOrder(TreeNode *p)
    {
        if (p == NULL)
            return;
        CenOrder(p->left);
        std::cout << p->data << " ";
        CenOrder(p->right);
    }
    
    void BinaryTree::LasOrder(TreeNode *p)
    {
        if (p == NULL)
            return;    
        LasOrder(p->left);
        LasOrder(p->right);
        std::cout << p->data << " ";
    }
    //层次遍历二叉树
    void BinaryTree::Trave(TreeNode *p)
    {
        std::queue<TreeNode*> q;
        q.push(p);
        while (!q.empty())
        {        
            TreeNode *s = q.front();        
            std::cout << s->data << " ";
            if (s->left != NULL)
                q.push(s->left);
            if (s->right != NULL)
                q.push(s->right);    
            q.pop();
        }
    }
    //二叉树深度
    int BinaryTree::Deepth(TreeNode *p)
    {
        int hl;
        int hr;
        int maxh;
        if (p)
        {
            hl = Deepth(p->left);
            hr = Deepth(p->right);
            maxh = (hl > hr) ? hl : hr;
            return (maxh + 1);
        }
        else
            return 0;
    }
    bool BinaryTree::Empty()
    {
        if (root == NULL)
            return true;
        else
            return false;
    }
    
    
    //测试代码
    #include <iostream>
    #include "BinaryTree.h"
    #include <string>
    #include <queue>
    using namespace std;
    
    
    int main()
    {
        BinaryTree *b = new BinaryTree(1);
        b->InsertNodeAsL(b->GetRoot(), 2);
        b->InsertNodeAsR(b->GetRoot(), 3);
        b->InsertNodeAsL(b->GetRoot()->left, 4);
        b->InsertNodeAsR(b->GetRoot()->left, 5);
        b->InsertNodeAsL(b->GetRoot()->right, 6);
        b->InsertNodeAsR(b->GetRoot()->right, 7);
        b->InsertNodeAsL(b->GetRoot()->left->left, 8);
        cout << "先序遍历: ";
        b->PreOrder(b->GetRoot());
        cout << endl;
        cout << "中序遍历: ";
        b->CenOrder(b->GetRoot());
        cout << endl;
        cout << "后序遍历: ";
        b->LasOrder(b->GetRoot());
        cout << endl;
        cout << "层次遍历: ";
        b->Trave(b->GetRoot());
        cout << endl;
        cout << "树的深度:";
        cout << b->Deepth(b->GetRoot());
        cout << endl;
        system("pause");
        return 0;
    }
  • 相关阅读:
    hdu 4504 dp问题 转化能力不够 对状态的转移也是不够
    BZOJ_2594_[Wc2006]水管局长数据加强版_LCT
    BZOJ_4530_[Bjoi2014]大融合_LCT
    BZOJ_3669_[Noi2014]魔法森林_LCT
    BZOJ_1180_[CROATIAN2009]OTOCI_LCT
    BZOJ_2631_tree_LCT
    BZOJ_3282_Tree_LCT
    BZOJ_2049_[Sdoi2008]Cave 洞穴勘测_LCT
    BZOJ_2622_[2012国家集训队测试]深入虎穴_最短路
    BZOJ_3653_谈笑风生_树状数组
  • 原文地址:https://www.cnblogs.com/yongssu/p/4396905.html
Copyright © 2011-2022 走看看