//biTreeNode class //================================================================================== //notation : //author :jiangtao //purpose: create a biTreeNode //================================================================================== //improvement: //elemtype need template so that it is shared type //the default elem should be the other number such as 65535 other than/except for 0 //traverse function need be free to be changed //HOW TO delete element otherwise while .exe run, it occupy too much memory //================================================================================== #include <iostream> #define elemtype int typedef BOOL (*VISITFUNC)(elemtype); class biTreeNode { //--------------biTreeNode properties---------------------------- private: biTreeNode* leftChild; biTreeNode* rightChild; elemtype m_elem; //--------------biTreeNode construct function and destruct function-------------- public: //----------construct function: initialize the biTreeNode biTreeNode() { leftChild= NULL; rightChild =NULL; m_elem =0; }; //-----------overload the construct function biTreeNode(elemtype a) { leftChild=rightChild=NULL; m_elem =a; }; //-----------destruct function: ~biTreeNode() { delete leftChild; delete rightChild; }; //------------------------------biTreeNode methods------------------------------- public: //------------get the private property,left child biTreeNode* getLeftChild() { return leftChild; }; //------------get the private property,left child //------------get the private property, right child biTreeNode* getRightChild() { return rightChild; }; //------------get the private property, right child //------------get the element of the node elemtype getElem() { return m_elem; } //------------get the element of the node //------------set the left child void setLeftChild(biTreeNode *T)//================当改为biTreeNode &T 是发生错误 { leftChild = T; } //------------set the left child //------------set the right child void setRightChild(biTreeNode *T)//================当改为biTreeNode &T 是发生错误 { rightChild = T; } //------------set the right child //------------set the elem of the node void setElem(elemtype a) { m_elem = a; } //------------set the elem of the node public: //------------prefix order traverse the biTree from the current biTreeNode //-------------------------------------------------------------- //function notation: //采用二叉链表格式存储二叉树节点,pFunc 是访问函数的指针, //这个指针是由typedef定义的。 //先序遍历二叉树biTree,对每个节点访问且仅访问一次。 //一旦访问失败,返回FALSE, 否则返回 TRUE //--------------------------------------------------------------- BOOL preOrderTraverse(biTreeNode *biTree, VISITFUNC pFunc); //------------prefix order traverse the biTree from the current biTreeNode //------------infix order traverse the biTree from the current biTreeNode //-------------------------------------------------------------- //function notation: //采用二叉链表格式存储二叉树节点,pFunc 是访问函数的指针, //这个指针是由typedef定义的。 //中序遍历二叉树biTree,对每个节点访问且仅访问一次。 //一旦访问失败,返回FALSE, 否则返回 TRUE //--------------------------------------------------------------- BOOL inOrderTraverse(biTreeNode * biTree, VISITFUNC pFunc); //------------infix order traverse the biTree from the current biTreeNode //------------postfix order traverse the biTree from the current biTreeNode //-------------------------------------------------------------- //function notation: //采用二叉链表格式存储二叉树节点,pFunc 是访问函数的指针,这个指针是由typedef定义的。 //后序遍历二叉树biTree,对每个节点访问且仅访问一次。 //一旦访问失败,返回FALSE, 否则返回 TRUE //--------------------------------------------------------------- BOOL postOrderTraverse(biTreeNode * biTree, VISITFUNC pFunc); //------------postfix order traverse the biTree from the current biTreeNode //------------lever order traverse the biTree from the current biTreeNode //-------------------------------------------------------------- //function notation: //采用二叉链表格式存储二叉树节点,pFunc 是访问函数的指针, //这个指针是由typedef定义的。 //层次遍历二叉树biTree,对每个节点访问且仅访问一次。 //一旦访问失败,返回FALSE, 否则返回 TRUE //--------------------------------------------------------------- BOOL levelOrderTraverse(biTreeNode * biTree, VISITFUNC pFunc); //------------lever order traverse the biTree from the current biTreeNode }; #include "StdAfx.h" #include "biTreeNode.h" #include <iostream> BOOL biTreeNode::preOrderTraverse(biTreeNode *biTree, VISITFUNC pFunc) { if (biTree==NULL)//以biTree指向的节点为根,当它为空返回TRUE { return TRUE; } else //当树不为空,则先序递归遍历:1、根节点 2、左子树 3、右子树 if((*pFunc)(biTree->m_elem))//访问根节点数据 { if(preOrderTraverse(biTree->leftChild,pFunc))//访问左子树 { if (preOrderTraverse(biTree->rightChild,pFunc))//访问右子树 { return TRUE;//当树的遍历成功返回TRUE } } } return FALSE; } BOOL biTreeNode::inOrderTraverse(biTreeNode *biTree, VISITFUNC pFunc) { if (biTree==NULL)//以biTree指向的节点为根,当它为空返回TRUE { return TRUE; } else //当树不为空,则中序递归遍历:1、根节点 2、左子树 3、右子树 if(inOrderTraverse(biTree->leftChild,pFunc))//访问左子树 { if((*pFunc)(biTree->m_elem))//访问根节点数据 { if (inOrderTraverse(biTree->rightChild,pFunc))//访问右子树 { return TRUE;//当树的遍历成功返回TRUE } } } return FALSE; } BOOL biTreeNode::postOrderTraverse(biTreeNode *biTree, VISITFUNC pFunc) { if (biTree==NULL)//以biTree指向的节点为根,当它为空返回TRUE { return TRUE; } else //当树不为空,则后序递归遍历:1、根节点 2、左子树 3、右子树 if(postOrderTraverse(biTree->leftChild,pFunc))//访问左子树 { if (postOrderTraverse(biTree->rightChild,pFunc))//访问右子树 { if((*pFunc)(biTree->m_elem))//访问根节点数据 { return TRUE;//当树的遍历成功返回TRUE } } } return FALSE; } BOOL biTreeNode::levelOrderTraverse(biTreeNode *biTree, VISITFUNC pFunc) { return TRUE; }