二叉树的先序、中序、后序遍历(删除树有问题)
来源:互联网 发布:查询数据库中重复记录 编辑:程序博客网 时间:2024/04/27 20:58
#include <iostream>using namespace std;//定义一个树节点struct CharNode{ char data; CharNode *pLeft; CharNode *pRight;};//创建一个树节点CharNode *CreateNode(char ndata){ CharNode *pNode = new CharNode; pNode -> data = ndata; pNode -> pLeft = NULL; pNode -> pRight = NULL; return pNode;}//连接结点void ConnectNode(CharNode *pNode1, CharNode *pNode2, CharNode *pNode3){ pNode1 -> pLeft = pNode2; pNode1 -> pRight = pNode3;}//释放二叉树的空间void FreeSpace(CharNode *pRoot){ if(pRoot != NULL) { FreeSpace(pRoot -> pLeft); FreeSpace(pRoot -> pRight); delete pRoot; }}//二叉树的删除void DestroyTree(CharNode *root){ if(root -> pLeft == NULL && root -> pRight == NULL) { delete root; return; } if(root -> pLeft) DestroyTree(root -> pLeft); if(root -> pRight) DestroyTree(root -> pRight); delete root;}//输出函数void PrintChar(char &c){ cout << c;}//递归实现(函数实现过程中,什么时候访问根结点,visit()放在什么位置)//先序遍历void PreOrder(CharNode *root, void(*visit)(char &item)){ if(root) { visit(root -> data); PreOrder(root -> pLeft, visit); PreOrder(root -> pRight, visit); }}//中序遍历void MiddleOrder(CharNode *root, void(*visit)(char &item)){ if(root) { MiddleOrder(root -> pLeft, visit); visit(root -> data); MiddleOrder(root -> pRight, visit); }}//后续遍历void PostOrder(CharNode *root, void(*visit)(char &itmem)){ if(root) { PostOrder(root -> pLeft, visit); PostOrder(root -> pRight, visit); visit(root -> data); }}int main(){ CharNode *pNode1 = CreateNode('A'); CharNode *pNode2 = CreateNode('B'); CharNode *pNode3 = CreateNode('C'); CharNode *pNode4 = CreateNode('D'); CharNode *pNode5 = CreateNode('E'); CharNode *pNode6 = CreateNode('F'); CharNode *pNode7 = CreateNode('G'); CharNode *pNode8 = CreateNode('H'); CharNode *pNode9 = CreateNode('I'); ConnectNode(pNode1, pNode2, pNode3); ConnectNode(pNode2, pNode4, pNode5); ConnectNode(pNode3, pNode5, pNode6); ConnectNode(pNode5, pNode7, NULL); ConnectNode(pNode6, pNode8, pNode9); PreOrder(pNode1, PrintChar); cout << endl; MiddleOrder(pNode1, PrintChar); cout << endl; PostOrder(pNode1, PrintChar); cout << endl; //DestroyTree(pNode1); FreeSpace(pNode1); return 0;}