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;
    }
  • 相关阅读:
    oracle数据库导入导出命令!
    windows 7资源管理器崩溃解决方法
    迅雷和vs 2010的冲突
    当前网页正在试图打开您的受信任的站点列表中的站点,招人烦的alimama和淘宝
    <xhtmlConformance mode="Legacy"/>时,UpdatePanel会失效。
    头回遇见网上找不到的问题,“缺少实例ID,实例ID是必需的”
    修改基础表后,刷新关联视图的两种方法
    关于PetShop的一些记录。
    Linux poll机制分析
    volatile原理与技巧
  • 原文地址:https://www.cnblogs.com/yongssu/p/4396905.html
Copyright © 2011-2022 走看看