二叉树的操作

问题:再一次验证自己功底的薄弱,对那些大侠只有仰慕的份。。。

简单说一下自己的感受,递归的实现是个栈,每次函数结束时,退回到上一层,函数结束默认为return。

二叉树的各种非递归实现用到的数据结构是栈。

这次用重温了STL中stack的用法。

 

代码:

#include <iostream>
#include <cstdlib>
#include <stack>
using namespace std;
 
typedef struct node
{
    char data;
    struct node *left;
    struct node *right;
}*BinTree;
 
void CreateBTree(BinTree &btree)            //建立二叉树
{
    char c;
    btree=(BinTree)malloc(sizeof(struct node));
    cin>>c;
    if(!btree)
    {
        cout<<"allocated fail"<<endl;
        exit(-1);
    }
    if(c!='#')
    {
        btree->data=c;
        CreateBTree(btree->left);
        CreateBTree(btree->right);
    }
    else
    {
        btree=NULL;
    }
 
}
void showBTree(BinTree btree)   //递归前序遍历二叉树
{
    if(btree)
    {
        cout<<btree->data<<" ";
        showBTree(btree->left);
        showBTree(btree->right);
    }
}
void inOrderBTree(BinTree btree)  //递归中序遍历二叉树
{
    if(btree)
    {
        inOrderBTree(btree->left);
        cout<<btree->data<<" ";
        inOrderBTree(btree->right);
 
    }
}
 
void postOrderBTree(BinTree btree)  //递归后续遍历二叉树
{
    if(btree)
    {
        postOrderBTree(btree->left);
        postOrderBTree(btree->right);
        cout<<btree->data<<" ";
    }
}
 
void displayBTree(BinTree btree)   //非递归前序遍历二叉树
{
    stack<BinTree> q;
    if(btree)
    {
    BinTree bt;
    q.push(btree);
    while(!q.empty())
    {
        while(bt=q.top())
        {
            cout<<bt->data<<" ";
            q.push(bt->left);
        }
        q.pop();
        if(!q.empty())
        {
            bt=q.top();
            q.pop();
            q.push(bt->right);
        }
    }
    }
     
}
 
void iOrder(BinTree btree)  //中序非递归遍历
{
    BinTree bt=NULL;
    stack<BinTree> s;
    s.push(btree);
    while(!s.empty())
    {
        while(bt=s.top())
        {
            s.push(bt->left);
        }
        s.pop();
        if(!s.empty())
        {
            bt=s.top();
            cout<<bt->data<<" ";
            s.pop();
            s.push(bt->right);
        }
    }
 
}
 
void pOrder(BinTree btree)
{
    stack<BinTree> s;
    BinTree cur=NULL;
    BinTree pre=NULL;
    s.push(btree);
    while(!s.empty())
    {
        cur=s.top();
        if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right)))
        {
            cout<<cur->data<<" ";
            s.pop();
            pre=cur;
        }
        else
        {
            if(cur->right)
                s.push(cur->right);
            if(cur->left)
                s.push(cur->left);      
        }
    }
}
 
int main()
{
    BinTree bt;
    cout<<"create bintree:"<<endl;
    CreateBTree(bt);
 
    cout<<"前序遍历二叉树:"<<endl;
    showBTree(bt);
    cout<<endl;
    cout<<"前序非递归遍历:"<<endl;
    displayBTree(bt);
    cout<<endl;
 
    cout<<"中序遍历二叉树:"<<endl;
    inOrderBTree(bt);
    cout<<endl;
    cout<<"中序非递归遍历二叉树:"<<endl;
    iOrder(bt);
    cout<<endl;
 
    cout<<"后序遍历二叉树:"<<endl;
    postOrderBTree(bt);
    cout<<endl;
    cout<<"后序非递归遍历:"<<endl;
    pOrder(bt);
    cout<<endl;
    return 0;
}

运行结果:

posted @   xshang  阅读(217)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示