一 .数组实现树
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"); }