码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构(4) -- 二叉树

时间:2015-04-06 23:11:46      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

//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;
}

 

数据结构(4) -- 二叉树

标签:

原文地址:http://www.cnblogs.com/yongssu/p/4396905.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!