数据结构二叉树

本文介绍了一种二叉树的构建方法,通过先序串输入创建二叉树,并实现了先序、中序、后序遍历。此外,还提供了计算叶子节点数量、树的深度以及非递归中序遍历的功能。代码示例详细展示了各个函数的实现,包括对空树的处理。
摘要由CSDN通过智能技术生成

数据结构二叉树

#include <iostream>
#include <cstdlib>
#include <stack>
using namespace std;
/********************************
已知二叉树的逻辑结构如下:
          A
         / \
        B   D
         \
          C
请完成:
1根据先缀串建立二叉树
2输出先序、中序和后序遍历的结果
3输出叶子节点的数量
4输出二叉树的深度
5输出非递归中序遍历的结果

输入用例:AB#C##D##
输出用例:
         ABCD
         BCAD
         CBDA
         2
         3
         BCAD
用例说明:
1输入用例中'#'表示空树
2输出用例的前三行分别代表三种遍历的结果
3输出用例的第四行表示叶子节点的数量
4输出用例的第五行表示树的深度
5输出用例的第六行表示非递归中序遍历结果

注意:建议在本用例基础上再自行设计1个复杂一点的用例作为测试
*********************************/
typedef struct BiTNode//二叉树结点结构
{
    string data;
    struct  BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
void CreateBiTree(BiTree &T)//根据先缀串建树
{
    /**请完善该函数**/
	char ch;
	cin>>ch; 
	if(ch=='#') T=NULL;
	else {
		if(T=new BiTNode){
			T->data=ch;
			CreateBiTree(T->lchild);
			CreateBiTree(T->rchild);
		}
		else{
			cout<<"Overflow"<<endl;
		}
	}
}

void PreOrderTraver(BiTree T)//先序遍历
{
    /**请完善该函数**/
	if(T){
		cout<<T->data;
		PreOrderTraver(T->lchild);
		PreOrderTraver(T->rchild);
	}
}
void InOrderTraver(BiTree T)//中序遍历
{
    /**请完善该函数**/
	if(T){
		InOrderTraver(T->lchild);
		cout<<T->data;
		InOrderTraver(T->rchild);
	}
}
void PostOrderTraver(BiTree T)//后序遍历
{
    /**请完善该函数**/
	if(T){
		PostOrderTraver(T->lchild);
		PostOrderTraver(T->rchild);
		cout<<T->data;
	}
}
void CountLeaf(BiTree T,int &c)//计算叶子节点数量
{
    /**请完善该函数**/
	if(T){
		if(!(T->lchild) && !(T->rchild)){
			c++;
		}
		else{
			CountLeaf(T->lchild,c);
			CountLeaf(T->rchild,c);
		}
	}
}
int Depth(BiTree T) //计算二叉树的深度
{
    /**请完善该函数**/
    if(!T) return 0;
    else{
    	return (Depth(T->lchild)>Depth(T->rchild) ? Depth(T->lchild) : Depth(T->rchild))+1;
	}
}
BiTNode *GoFarLeft(BiTree T,stack<BiTNode *> &S) //找T的最左下结点
{
    if(!T) return NULL;
    while(T->lchild)
    {
        S.push(T);
        T=T->lchild;
    }
    return T;
}
void Inorder_I(BiTree T)
{
    /**请完善该函数,需要用到的GoFarLeft函数上面已经定义完毕**/
	stack<BiTree> S;
	T=GoFarLeft(T,S);
	while(T){
		cout<<T->data;
		if(T->rchild){
			T=GoFarLeft(T->rchild,S);
		}else if(!S.empty()){
			T=S.top();
			S.pop();
		}else{
			T=NULL;
		}
	}
}
int main()
{
    BiTree T;
    CreateBiTree(T);//建树
    PreOrderTraver(T);//先序遍历
    cout<<endl;
    InOrderTraver(T);//中序遍历
    cout<<endl;
    PostOrderTraver(T);//后序遍历
    cout<<endl;
    int c=0;//叶子数量
    CountLeaf(T,c);//计算叶子数量
    cout<<c;
    cout<<endl;
    cout<<Depth(T);//计算深度并输出
    cout<<endl;
    Inorder_I(T);//中序的非递归遍历
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值