此树根节点索引为0,不存储数据节点,从根节点开始向下的节点开始存储数据,也就是从节点1开始存储数据。
Node.h
#pragma once #include<iostream> using namespace std; template<class T> class Node { public: int index; T data; Node<T> * pLChild; Node<T> * pRChild; Node<T> * pParent; Node(int index = 0,T data = 0) { this->index = index; this->data = data; pLChild = NULL; pRChild = NULL; pParent = NULL; } Node(const Node<T> & node) { index = node.index; data = node.data; pLChild = NULL; pRChild = NULL; pParent = NULL; } Node<T> * SearchNode(int nodeIndex) { if (index == nodeIndex) return this; Node * temp = NULL; if (pLChild != NULL) { temp = pLChild->SearchNode(nodeIndex); if (temp != NULL) return temp; } if (pRChild != NULL) { temp = pRChild->SearchNode(nodeIndex); if (temp != NULL) return temp; } return NULL; } void DeleteNode() { if (pLChild != NULL) pLChild->DeleteNode(); if (pRChild != NULL) pRChild->DeleteNode(); if (pParent != NULL) { if (pParent->pLChild == this) pParent->pLChild = NULL; if (pParent->pRChild == this) pParent->pRChild = NULL; } delete this; } void PreorderTraversal() { cout << index << " " << data << endl; if (pLChild != NULL) pLChild->PreorderTraversal(); if (pRChild != NULL) pRChild->PreorderTraversal(); } void InorderTraversal() { if (pLChild != NULL) pLChild->InorderTraversal(); cout << index << " " << data << endl; if (pRChild != NULL) pRChild->InorderTraversal(); } void PostorderTraversal() { if (pLChild != NULL) pLChild->PostorderTraversal(); if (pRChild != NULL) pRChild->PostorderTraversal(); cout << index << " " << data << endl; } ~Node() {} friend ostream& operator<<(ostream &os, const Node<T> *node) { os << node->data; return os; } };
Tree.h
#pragma once #include"Node.h" template<class T> class Tree { public: Tree();//传递初始头数据节点的值与容量 ~Tree(); Node<T> * SearchNode(int nodeIndex); bool AddNode(int nodeIndex, bool direction, const Node<T> & pNode);//direction = false 表示左孩子,true表示右孩子 bool DeleteNode(int nodeIndex); void PreorderTraversal(); void InorderTraversal(); void PostorderTraversal(); private: Node<T> * m_pRoot;//以索引0开始为头节点 };
Tree.cpp
#include<iostream> #include"Tree.h" using namespace std; template<class T> Tree<T>::Tree() { m_pRoot = new Node<T>(); } template<class T> Tree<T>::~Tree() { DeleteNode(0); } template<class T> Node<T> * Tree<T>::SearchNode(int nodeIndex) { return m_pRoot->SearchNode(nodeIndex); } template<class T> bool Tree<T>::AddNode(int nodeIndex, bool direction,const Node<T> & pNode) { Node<T> * temp = SearchNode(nodeIndex); if (temp == NULL) return false; Node<T> * node = new Node<T>(pNode); node->pParent = temp; if (!direction)//挂载到左孩子 { if (temp->pLChild != NULL) return false; temp->pLChild = node; return true; } if (direction)//挂载到右孩子 { if (temp->pRChild != NULL) return false; temp->pRChild = node; return true; } return false; } template<class T> bool Tree<T>::DeleteNode(int nodeIndex) { Node<T> * temp = SearchNode(nodeIndex); if (temp == NULL) return false; temp->DeleteNode(); return true; } template<class T> void Tree<T>::PreorderTraversal() { m_pRoot->PreorderTraversal(); } template<class T> void Tree<T>::InorderTraversal() { m_pRoot->InorderTraversal(); } template<class T> void Tree<T>::PostorderTraversal() { m_pRoot->PostorderTraversal(); }
main.cpp
#include<iostream> #include"Tree.h" #include"Tree.cpp" using namespace std; /*建立如图所示树 (0) 5(1) 8(2) 2(3) 6(4) 9(5) 7(6) */ int main() { Tree<int> * tree = new Tree<int>(); Node<int> node1(1, 5); Node<int> node2(2, 8); Node<int> node3(3, 2); Node<int> node4(4, 6); Node<int> node5(5, 9); Node<int> node6(6, 7); tree->AddNode(0, 0, node1); tree->AddNode(0, 1, node2); tree->AddNode(1, 0, node3); tree->AddNode(1, 1, node4); tree->AddNode(2, 0, node5); tree->AddNode(2, 1, node6); //tree->DeleteNode(1); tree->PreorderTraversal(); //tree->InorderTraversal(); //tree->PostorderTraversal(); delete tree; return 0; }