zoukankan      html  css  js  c++  java
  • 树的基本操作

    一 .数组实现树

    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");
    }
  • 相关阅读:
    浅析什么是HOOK
    用diff命令生成Patch,用Patch命令打Patch
    Git 协作:Fetch Pull Push Branch Remote Rebase Cherry-pick相关
    apt-get update 101错误解决办法
    Python函数参数中的冒号与箭头
    Python中的多线程编程,线程安全与锁(二)
    使用pdb模块调试Python
    Python中的多线程编程,线程安全与锁(一)
    聊聊Python中的GIL
    Python中的单元测试模块Unittest快速入门
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/8683247.html
Copyright © 2011-2022 走看看