二叉树的先序、中序、后序遍历(删除树有问题)

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值