快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

【我的算法笔记】二叉树的创建、二叉树的遍历(递归、非递归)-创新互联

创新互联建站于2013年创立,先为肃北等服务建站,肃北等地企业,进行企业商务咨询服务。为肃北企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
文章目录
  • 目录

    文章目录

    前言

    树的结构体定义

    二叉树的创建(先序递归) 

    二叉树的先序遍历(递归)

    二叉树的中序遍历(递归) 

    二叉树的后序遍历(递归)

    二叉树的先序非递归遍历算法1

    二叉树的先序非递归遍历算法2

    二叉树的中序非递归算法

    二叉树的后序非递归算法1

    二叉树的非递归后序遍历算法2

    二叉树的层次遍历算法

    主函数 


前言

本篇文章主要包括二叉树的创建以及二叉树的前序、中序、后序遍历的递归算法以及前序、中序、后序、层次遍历的非递归算法


  • 树的结构体定义
typedef struct node{
    char data;
    struct node *lchild,*rchild;
}*BiTree;
  • 二叉树的创建(先序递归) 
//递归建立二叉树(先序遍历)
void CreatBiTree(BiTree &T){
    char c;
    cin>>c;
    if(c=='0'){
        T=NULL;
    }else{
        T=new node;
        T->data=c;
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
}
  • 二叉树的先序遍历(递归)
//先序遍历递归
void PreOrder(BiTree T){
    if(T!=NULL){
        cout<data<<' ';
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}
  • 二叉树的中序遍历(递归) 
//递归中序遍历
void InOrder(BiTree T){
    if(T!=NULL){
        InOrder(T->lchild);
        cout<data<<' ';
        InOrder(T->rchild);
    }
}
  • 二叉树的后序遍历(递归)
//递归后序遍历算法
void PostOrder(BiTree T){
    if(T!=NULL){
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        cout<data<<' ';
    }
}
  • 二叉树的先序非递归遍历算法1

头文件中要包含#include

//非递归先序遍历算法1
void PreOrder1(BiTree T){
    if(T!=NULL){
        stackSt;
        BiTree p;
        St.push(T);
        while(!St.empty()){
            p=St.top();
            St.pop();
            cout<data<<' ';
            if(p->rchild!=NULL){
                St.push(p->rchild);
            }
            if(p->lchild!=NULL){
                St.push(p->lchild);
            }
        }
    }
}
  • 二叉树的先序非递归遍历算法2
//非递归先序遍历2
void PreOrder2(BiTree T){
    if(T!=NULL){
        stackSt;
        BiTree p=T;
        while(!St.empty()||p!=NULL){
            while(p!=NULL){
                cout<data<<' ';
                St.push(p);
                p=p->lchild;
            }
            if(!St.empty()){
                p=St.top();
                St.pop();
                p=p->rchild;
            }
        }
    }
}
  • 二叉树的中序非递归算法

与先序非递归遍历算法2的区别仅在于节点值输出的位置不同

//非递归中序遍历
void InOrder1(BiTree T){
    if(T!=NULL){
        stackSt;
        BiTree p=T;
        while(!St.empty()||p!=NULL){
            while(p!=NULL){
                St.push(p);
                p=p->lchild;
            }
            if(!St.empty()){
                p=St.top();
                St.pop();
                cout<data<<' ';
                p=p->rchild;
            }
        }
    }
}
  • 二叉树的后序非递归算法1

需要用到两个栈

//非递归后序遍历算法1
void PostOrder1(BiTree T){
    if(T!=NULL){
        stackSt1;
        stackSt2;
        BiTree p=NULL;
        St1.push(T);
        while(!St1.empty()){
            p=St1.top();
            St1.pop();
            St2.push(p);
            if(p->lchild!=NULL){
                St1.push(p->lchild);
            }
            if(p->rchild!=NULL){
                St1.push(p->rchild);
            }
        }
        while(!St2.empty()){
            p=St2.top();
            St2.pop();
            cout<data<<' ';
        }
    }
}
  • 二叉树的非递归后序遍历算法2

这个算法具有一个良好的性质:每当访问到这个节点时,栈中存放的是这个节点的祖先节点。由这个算法可以改写得到其他许多问题的解法。

//非递归后序遍历算法2
void PostOrder2(BiTree T){
    if(T!=NULL){
        stackSt;
        BiTree p=T;
        BiTree r=NULL;
        while(p!=NULL||!St.empty()){
            if(p!=NULL){
                St.push(p);
                p=p->lchild;
            }
            else{
                p=St.top();
                if(p->rchild!=NULL&&p->rchild!=r){
                    p=p->rchild;
                }else{
                    p=St.top();
                    St.pop();
                    cout<data<<' ';
                    r=p;
                    p=NULL;
                }
            }
        }
    }
}
  • 二叉树的层次遍历算法

头文件中要包含#include

//层次遍历
void LevelOrder(BiTree T){
    queueQ;
    Q.push(T);
    BiTree p;
    while(!Q.empty()){
        p=Q.front();
        Q.pop();
        cout<data<<' ';
        if(p->lchild!=NULL){
            Q.push(p->lchild);
        }
        if(p->rchild!=NULL){
            Q.push(p->rchild);
        }
    }
}
主函数 
int main(){
    system("chcp 65001");//控制输出中文
    BiTree T;
    CreatBiTree(T);
    cout<<"二叉树的先序遍历序列为:";
    PreOrder(T);
    cout<

运行结果如下图所示:

上例中建的树如下图所示:

总结

  以上就是这篇文章的全部内容,介绍了二叉树的构建以及遍历。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:【我的算法笔记】二叉树的创建、二叉树的遍历(递归、非递归)-创新互联
文章URL:http://6mz.cn/article/cdiohg.html