树的基本操作

一 .数组实现树

tree.h

#pragma once

class Tree
{
public:
    Tree(int nsize,int *Root);//创建树
    ~Tree();//销毁树
    int* SearchNode(int index);//
    bool AddNode(int index , int direction,int* pNode);//
    void DeleteNode(int index,int* pNode);//
    void Traverse();
private:
    int* m_pTree;
    int m_size;
};

tree.cpp

#include "tree.h"

Tree::Tree(int nsize,int* Root)//创建树
{
    m_size = nsize;
    m_pTree = new int[nsize];
    for(int i = 0; i < nsize; i++)
    {
        m_pTree[i] = 0;
    }
    m_pTree[0] = * Root;
}
Tree::~Tree()//销毁树
{
    delete []m_pTree;
    m_pTree = 0;
}
int* Tree::SearchNode(int index)//
{
    if(index < 0 || index >= m_size)
        return NULL;
    if(m_pTree[index] == 0)
        return NULL;
    return &m_pTree[index];
}
bool Tree::AddNode(int index , int direction,int* pNode)//
{
    if(index < 0 || index >= m_size)
        return false;
    if(m_pTree[index] == 0)
        return false;
    if(direction == 0)
    {
        if(index*2+1 >= m_size)
            return false;
        if(m_pTree[index*2+1] != 0)
            return false;
        m_pTree[index*2+1] = *pNode;
    }

    if(direction == 1)
    {
        if(index*2+2 >= m_size)
            return false;
        if(m_pTree[index*2+2] != 0)
            return false;
        m_pTree[index*2+2] = *pNode;
    }
    return true;

}
void Tree::DeleteNode(int index,int* pNode)//
{
    if(index < 0 || index >= m_size)
        return ;
    if(m_pTree[index] == 0)
        return ;
    *pNode = m_pTree[index];
    //delete(m_pTree[index]);
    m_pTree[index] = 0;
}
void Tree::Traverse()
{
    for(int i = 0; i < m_size; i++)
        cout<< m_pTree[i]<<" ";
    cout<<endl;
}

main.cpp

#include <iostream>
#include "tree.h"
using namespace std;
int main()
{
    int Root = 3;
    Tree* tree = new Tree(10,&Root);
    int node1 = 5;
    int node2 = 8;
    tree->AddNode(0,0,&node1);
    tree->AddNode(0,1,&node2);
    int node3 = 2;
    int node4 = 6;
    tree->AddNode(1,0,&node3);
    tree->AddNode(1,1,&node4);
    int node5 = 9;
    int node6 = 7;
    tree->AddNode(2,0,&node5);
    tree->AddNode(2,1,&node6);
    tree->Traverse();
    int pNode;
    tree->DeleteNode(6,&pNode);//?????
    cout<<pNode<<endl;
    int *p;
    p = tree->SearchNode(0);
    cout<<*p<<endl;
    delete tree;//析构函数

}

 二.链表实现树

Node.h

#pragma  once
class Node
{
public:
    Node();
    int index;
    int data;
    Node* pLChild;
    Node* pRChild;
    Node* pParent;
public:
    Node* SearchNode(int index);
    void DeleteNode();
    void PreTraval();
    void OrderTraval();
    void PostTraval();
};

Node.cpp

#include "Node.h"
#include <stdio.h>
#include <iostream>
using namespace std;
Node::Node()
{
    index = 0;
    data = 0;
    pLChild = 0;
    pRChild = 0;
    pParent = 0;
}
Node* Node::SearchNode(int index)
{
    Node* temp = NULL;
    if(this->index == index)
        return this;
    if(this->pLChild != NULL)
    {
        temp = this->pLChild->SearchNode(index);
        if(temp) return temp;
    }
    if(this->pRChild != NULL)
    {
       temp = this->pRChild->SearchNode(index);
       return temp;
    }
    return NULL;//???
}
void Node::DeleteNode()
{
    if(this->pLChild != NULL)
    {
        this->pLChild->DeleteNode();
    }
    if(this->pRChild != NULL)
    {
        this->pRChild->DeleteNode();
    }
    if(this->pParent!=NULL)
    {
        if(this->pParent->pLChild == this)
            this->pParent->pLChild = NULL;
        if(this->pParent->pRChild == this)
            this->pParent->pRChild = NULL;
    }
    delete this;
}
void Node::PreTraval()
{
    cout<<this->index<<"   "<<this->data<<endl;
    if(this->pLChild)
        this->pLChild->PreTraval();
    if(this->pRChild)
        this->pRChild->PreTraval();
}
void Node::OrderTraval()
{
    if(this->pLChild)
        this->pLChild->OrderTraval();
    cout<<this->index<<"   "<<this->data<<endl;
    if(this->pRChild)
        this->pRChild->OrderTraval();
}
void Node::PostTraval()
{
    if(this->pLChild)
        this->pLChild->PostTraval();
    if(this->pRChild)
        this->pRChild->PostTraval();
    cout<<this->index<<"   "<<this->data<<endl;
}

TreeNode.h

#pragma once
#include "Node.h"

class TreeNode
{
public:
    TreeNode();//创建树
    ~TreeNode();//销毁树
    Node* SearchNode(int index);//
    bool AddNode(int index , int direction,Node* pNode);//
    void DeleteNode(int index,Node* pNode);//
    void PreTraval();
    void OrderTraval();
    void PostTraval();
private:
    Node* m_pRoot;
};

TreeNode.cpp

#include "treeNode.h"
#include "Node.h"
#include <stdio.h>
#include <iostream>
using namespace std;
TreeNode::TreeNode()
{
    m_pRoot = new Node();
}
TreeNode::~TreeNode()
{
    DeleteNode(0,NULL);
    m_pRoot->DeleteNode();
}
Node* TreeNode::SearchNode(int index)//
{
    return m_pRoot->SearchNode(index);
}
bool TreeNode::AddNode(int index , int direction,Node* pNode)//
{
    Node* temp;
    temp = m_pRoot->SearchNode(index);
    if(!temp)
        return false;
    Node* node = new Node();
    if(node == NULL)
        return false;
    node->index = pNode->index;
    node->data = pNode->data;
    node->pParent = temp;
    if(direction == 0)
    {
        temp->pLChild = node;
    }
    if(direction == 1)
    {
        temp->pRChild = node;
    }
    return true;
}
void TreeNode::DeleteNode(int index,Node* pNode)//
{
    Node* temp;
    temp = m_pRoot->SearchNode(index);
    if(!temp) 
        return ;
    if(pNode)
        pNode->data = temp->data;
    temp->DeleteNode();
}
void TreeNode::PreTraval()
{
    m_pRoot->PreTraval();
}
void TreeNode::OrderTraval()
{
    m_pRoot->OrderTraval();
}
void TreeNode::PostTraval()
{
    m_pRoot->PostTraval();
}

main.cpp(测试)

#include "treeNode.h"
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
    TreeNode *pTree =new TreeNode();
    Node* node1= new Node();
    Node* node2 = new Node();
    Node* node3 = new Node();
    Node* node4 = new Node();
    Node* node5 = new Node();
    Node* node6 = new Node();
    node1->index = 1;node1->data = 5;
    node2->index = 2;node2->data = 8;
    pTree->AddNode(0,0,node1);
    pTree->AddNode(0,1,node2);
    node3->index = 3;node3->data = 2;
    node4->index = 4;node4->data = 6;
    pTree->AddNode(1,0,node3);
    pTree->AddNode(1,1,node4);
    node5->index = 5;node5->data = 9;
    node6->index = 6;node6->data = 7;
    pTree->AddNode(2,0,node5);
    pTree->AddNode(2,1,node6);
    //pTree->PreTraval();
    //pTree->OrderTraval();

    //Node* temp = new Node;
    //pTree->DeleteNode(2,temp);
    //pTree->PostTraval();
    //cout<<temp->data<<endl;
    Node* tmp;
    tmp = pTree->SearchNode(5);
    cout<<tmp->data<<endl;
    system("pause");
}
原文地址:https://www.cnblogs.com/Lune-Qiu/p/8683247.html