C++递归创建、非递归遍历二叉树的基本操作

本文介绍了二叉树的基本操作,包括递归创建和非递归遍历。详细讲解了先序、中序、后序遍历的实现,并对比了深度优先和广度优先搜索的时间和空间复杂度。递归和迭代两种方法各有优劣,实际应用中需根据需求选择。
摘要由CSDN通过智能技术生成

       最近学了二叉树,这个数据结构和它的名字一样,真是二叉。如果单纯的让我想这样的算法,以笔者的脑子想一辈子都想不出来。二叉树刚学完,老师又讲了图。

       俗话说,不能在一棵树上吊死,那我选择在二叉树上吊死。关键是图还在下面扯着你,二叉树这个数据结构不会真的是憋死人。

       下面,我将我各种查阅书籍与上网翻找得出的结果告诉大家,让大家能够清楚地了解二叉树的基本操作。

#include <iostream>
using namespace std;
#define MAXSIZE 100
class BTNode{
public:
    char data;
    BTNode *leftChild;
    BTNode *rightChild;
    BTNode():leftChild(NULL),rightChild(NULL){}
};
class binaryTree{
private:
    BTNode *root;
public:
    binaryTree();
    ~binaryTree();
    void deleteTree (BTNode *rt);
    BTNode *create_Tree();
    BTNode *getRoot();
    void PreOrder(BTNode *root);
    void InOrder(BTNode *root);
    void PostOrder(BTNode *root);
    void LevelOrder(BTNode *root);
    
};

binaryTree::binaryTree()
{
    root = create_Tree();
}
binaryTree::~binaryTree()
{
    deleteTree(root);
}


BTNode *binaryTree::create_Tree()
{
    BTNode *root;
    char ch;
    cin>>ch;
    if(ch == '#')
        root = NULL;
    else
    {
        root = new BTNode;
        root->data = ch;
        root->leftChild = create_Tree();
        root->rightChild = create_Tree();
    }
    return root;
}

void binaryTree::deleteTree (BTNode *rt)
{
    if (rt!=NULL)
    {
        deleteTree(rt->leftChild);
        deleteTree(rt->rightChild);
        delete rt;
    }
}

BTNode *binaryTree::getRoot()
{
    return root;
}

void binaryTree::PreOrder(BTNode *root)     //先序周游非递归算法(用栈实现)
{
    BTNode *st[MAXSIZE],*p = NULL;
    int top = -1;
    if(root != NULL)
    {
        top++;
        st[top] = root;                     //根节点入栈
        while(top>-1)                       //判断当栈非空时循环
        {
            p = st[top];                    //栈顶内容赋给p(即将输入的内容存放在p中)
            top--;
            cout<<p->data<<" ";             //输出栈顶内容
            if(p->rightChild != NULL)       //右孩子入栈
            {
                top++;
                st[top] = p->rightChild;
            }
            if(p->leftChild != NULL)        //左孩子入栈
            {
                top++;
                st[top] = p-&
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值