二叉树的非递归前中后序遍历和层序遍历

博客围绕二叉树的非递归前中后序遍历和层序遍历展开,树以 前序遍历+“#” 法构建,给出了树的前序序列及形状,还包含输出样例和代码注释,是数据结构课程作业的非递归实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的非递归前中后序遍历和层序遍历

此次构建的树是以 前序遍历+“#” 法构建的,构建的树的前序序列为

A,B,C,#,#,D,E,#,G,#,#,F,#,#,#;

树的形状为

             A
            /
           B
          / \
         C   D
            / \
           E   F
            \
             G

注:"#" 位未标出

输出样例
在这里插入图片描述

以下为代码及注释

#include<iostream>
#include<stdlib.h>
#include<stack> //为方便,直接使用了stack和queue的库,不再另外去写函数
#include<queue>
using namespace std;

int count = -1;//计数器 

typedef struct BiTNode{
	char data;
	struct BiTNode *lchild ,*rchild;
}BiTNode,*BiTree;

 
BiTree CreatBiTree();
void PreOrderTraverse(BiTree T);
void InOrderTraverse(BiTree T);
void PostOrderTraverse(BiTree T);
void LeverOrderTraverse(BiTree T);

int main()
{
	cout<<"----------------------------------------"<<endl;
	cout<<"structname : 二叉树的几个遍历 "<<endl; 
	cout<<"author : william"<<endl;
	cout<<"-------------------@copyright by william"<<endl<<endl;
	
    char PreOrder[15] ={'A','B','C','#','#','D','E','#','G','#','#','F','#','#','#'};
    cout<<"构建二叉树所用的前序遍历数据为 "<<PreOrder<<endl<<endl;
    cout<<"树的形状为"<<endl;
    cout<<"             A         "<<endl;
    cout<<"           B           "<<endl;
    cout<<"         C   D         "<<endl;
    cout<<"           E   F       "<<endl;
    cout<<"             G         "<<endl;
    putchar('\n');
	BiTree myBinaryTree;	
	myBinaryTree = CreatBiTree();
    cout<<"创建树  OK"<<endl<<endl;
    
	cout<<"先序遍历的结果"<<endl;
    PreOrderTraverse(myBinaryTree);
    putchar('\n');
    
    cout<<"中序遍历的结果"<<endl;
    InOrderTraverse(myBinaryTree);
    putchar('\n');
    
    cout<<"后序遍历的结果"<<endl;
    PostOrderTraverse(myBinaryTree);
    putchar('\n');

    cout<<"层序遍历的结果"<<endl;
    LeverOrderTraverse(myBinaryTree); 
    
	return 0;
}


BiTree CreatBiTree()
{
	++count;//用于计数使每次数组里的数据后移 
	BiTNode *tmp = NULL;
    char PreOrder[15] = {'A','B','C','#','#','D','E','#','G','#','#','F','#','#','#'};
	if (PreOrder[count] == '#') 
	{
		return NULL;
	}
	else 
	{
		tmp = (BiTree)malloc(sizeof(BiTNode));//创建新的节点 
		if (tmp == NULL) 
		{
			return NULL;//如果创建失败 
		}
		tmp->data = PreOrder[count];
		tmp->lchild = CreatBiTree();
		tmp->rchild = CreatBiTree();//递归调用 
		return tmp;	
	}
}

void PreOrderTraverse(BiTree T)//前序遍历 
{ 
    if (T == NULL)
    {
        return;//空树 
    }
    BiTree p = T;//移动的节点 
    stack<BiTree>s;
    while (!s.empty() || p)
    {
        if (p)
        {
            cout<<p->data<<" ";//先输出根的数据 
            s.push(p);
            p = p->lchild;
        }
        else
        {
            p = s.top();//左子树遍历完毕进入右子树 进行遍历 
            s.pop();
            p = p->rchild;
        }
    }
    cout << endl;
}

void InOrderTraverse(BiTree T)//中序遍历 
{ 
    if (T == NULL)
    {
        return;//空树 
    }
    BiTree p = T;//移动的节点 
    stack<BiTree>s;
    while (!s.empty() || p)
    {
        if (p)
        {
		    s.push(p);
            p = p->lchild;//先将左边的节点都压入栈中 
        }
        else
        {
            p = s.top();
			cout<<p->data<<" "; //输出了子树根的节点(左子树已经遍历完毕)转入右子树 
            s.pop();
            p = p->rchild;
        }
    }
    cout << endl;
}

void PostOrderTraverse(BiTree T)
{
	if(T == NULL)
	{
		return;
	}
	stack<BiTree>s;	
	BiTree p = T;//移动的节点 
	BiTree temp;
	while(!s.empty() || p)
	{
		while(p)
		{
			s.push(p);
			p = p->lchild;
		}
		p = s.top();//弹出了,但没有完全没弹出 
		if(p->rchild == NULL || p->rchild == temp)//第二个判断当前p是否是右子树读完返回的 
		{
			cout<<p->data<<" ";
			s.pop();
			temp = p;
			p = NULL;//重置p 
		}
		else
		{
			p = p->rchild;
		}
	}
	cout<<endl;
}

void LeverOrderTraverse(BiTree T) //层序遍历_队列实现 ( BFS )
{
    queue <BiTree> q;
    BiTree p;//用于移动 
    if (T != NULL)
    {
        q.push(T);   //根节点进队列
    }
    while (!q.empty())  //队列不为空判断
    {
    	p = q.front();
        cout << p->data<<" "; 
        if (p->lchild!= NULL)   //如果有左孩子,leftChild入队列
        {
            q.push(p->lchild);   
        }
        if (p->rchild != NULL)   //如果有右孩子,rightChild入队列
        {
            q.push(p->rchild);
        }
        q.pop();  //已经遍历过的节点出队列
    }
}

数据结构课程的作业–前中后序和层序的非递归实现。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值