二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...

本文介绍了二叉树的先序、中序、后序遍历以及如何实现线索二叉树的遍历,提供了C++实现的详细代码,包括层次遍历和计算叶子节点数、树的深度等操作。
摘要由CSDN通过智能技术生成

二叉树的先序,中序,后序遍历以及线索二叉树的遍历

(2008-05-04 17:52:49)

标签:

杂谈

C++

二叉树的先序,中序,后序遍历以及线索二叉树的遍历

头文件

//*******************************************************************************

//二叉树中的数据类型为ElemType

//*******************************************************************************

// BinaryTree.h: interface for the CBinaryTree class.

//

//

#include //C++语言

#define OK 1

#define ERROR 0

class CBinaryTree

{

public:

CBinaryTree();

virtual ~CBinaryTree();

protected:

typedef int ElemType;

struct Node

{ //数据

ElemType data; //数据域信息

int lt; //前继指针标志

int rt; //后继指针标志

Node* lchild; //指向左孩子

Node* rchild; //指向右孩子

}*root,*head;

public:

int Create();

int PreOrderTraverse();

int MidOrderTraverse();

int LastOrderTraverse();

void LevelOrderTraverse();

int GetLeafCount();

int GetDepth();

int GetNodeCount();

int MidOrderTraverseThr();

void ChangeLeftRight();

void Destroy();

private: //重载以上函数,供以上函数调用

int Create(Node* &node);

int PreOrderTraverse(Node*node);

int MidOrderTraverse(Node*node);

int LastOrderTraverse(Node *node);

int GetLeafCount(Node*node);

void GetNodeCount(Node*node,int &count);

int GetDepth(Node*node);

void ChangeLeftRight(Node*node);

void Visit(Node*node);

void Destroy(Node*node);

};

// 实现文件

// BinaryTree.cpp: implementation of the CBinaryTree class.

#include "BinaryTree.h"

#include "Stack.h"

#include "Queue.h"

//

// Construction/Destruction

//

CBinaryTree::CBinaryTree()

{

root=NULL;

head=NULL;

}

CBinaryTree::~CBinaryTree()

{

Destroy();

}

int CBinaryTree::Create()

{ //创建一个二叉树

return Create(root);

//用户调用此函数,创建根结点,由此函数调用其内的

//CreateNode()创建除根结点外的其它所有结点

}

int CBinaryTree::PreOrderTraverse()

{ //先序遍历二叉树

return PreOrderTraverse(root);

}

int CBinaryTree::MidOrderTraverse()

{ //中序遍历二叉树

return MidOrderTraverse(root);

}

int CBinaryTree::LastOrderTraverse()

{ //后序遍历二叉树

return LastOrderTraverse(root);

}

void CBinaryTree::LevelOrderTraverse()

{ //借助于堆栈,完成二叉树的层次遍历

CQueue queue;

if(!root) return;

queue.InitQueue();

Node*p=root; //初始化

Visit(p);

queue.EnQueue((long)p);

//访问根结点,并将根结点地址入队

while(!queue.QueueEmpty())

{ //当队非空时重复执行下列操作

p=(Node*)queue.DeQueue(); //地址出队

if(p->lchild)

{

Visit(p->lchild);

queue.EnQueue((long)p->lchild); //处理左孩子

}

if (p->rchild)

{

Visit(p->rchild);

queue.EnQueue((long)p->rchild); //处理右孩子

}

}

}

int CBinaryTree::GetLeafCount()

{ //返回叶子结点数

return GetLeafCount(root);

}

int CBinaryTree::GetNodeCount()

{ //返回总结点数

int count=0;

GetNodeCount(root,count);

return count;

}

int CBinaryTree::GetDepth()

{ //返回二叉树的深度

return GetDepth(root);

}

void CBinaryTree::ChangeLeftRight()

{ //交换左右两孩子结点

if(root!=NULL)

ChangeLeftRight(root);

}

int CBinaryTree::Create(Node *&node)

{

int i;

cout<

不创建本结点):";

cin>>i;

if(i==0)

node=NULL;

else

{

if(!(node=new Node))

return ERROR;

node->data=i;

node->lt=0;

node->rt=0;

Create(node->lchild); //创建左子树

Create(node->rchild); //创建右子树

}

return OK;

}

int CBinaryTree::PreOrderTraverse(Node *node)

{

if(node!=NULL)

{

cout<data<

if(PreOrderTraverse(node->lchild)) //遍历左子树

if(PreOrderTraverse(node->rchild)) //遍历右子树

return 1;

return 0;

}

else

return 1;

}

int CBinaryTree::MidOrderTraverse(Node *node)

{

if(node!=NULL)

{

if(MidOrderTraverse(node->lchild))//遍历左子树

cout<data<

if(MidOrderTraverse(node->rchild))//遍历右子树

return 1;

return 0;

}

else

return 1;

}

int CBinaryTree::LastOrderTraverse(Node *node)

{

if(node!=NULL)

{

if(LastOrderTraverse(node->lchild)) //遍历左子树

if(LastOrderTraverse(node->rchild)) //遍历右子树

{

cout<data<

return 1;

}

return 0;

}

else

return 1;

}

int CBinaryTree::MidOrderTraverseThr()

{ //中序线索化二叉树

if(head!=NULL)

delete head;

head=new Node;

if(head==NULL)

return 0;

int i=0;

Node*pre=NULL,*cur=NULL;

long *temp=new long[GetNodeCount()];

head->lt=0; //无前驱,有左孩子

head->rt=1; //有后继,无右孩子

head->rchild=head;

if(root==NULL)

head->lchild=head;

else

{

head->lchild=root;

pre=head;

cur=root;

for(;i>0 || cur!=NULL;)

{

for(;cur!=NULL;temp[i]=(long)cur,i++,cur=cur->lchild);

if(i>0)

{

cur=(Node*)temp[--i];

cout<data<

if(cur->lchild==NULL)

{

cur->lt=1;

cur->lchild=pre;

}

if(pre->rchild==NULL)

{

pre->rt=1;

pre->rchild=cur;

}

pre=cur;

cur=cur->rchild;

}

}

pre->rchild=head;

pre->rt=1;

head->rchild=pre;

}

delete temp;

return 1;

}

void CBinaryTree::GetNodeCount(Node *node,int &count)

{

if(node!=NULL)

count++;

else

return;

GetNodeCount(node->lchild,count);//统计左子树个数

GetNodeCount(node->rchild,count);//统计右子树个数

}

int CBinaryTree::GetDepth(Node *node)

{

int d=0,depthr=0,depthl=0;

if (node==NULL)

return 0; // 如果是空树,则其深度为 0

else

{

depthl=GetDepth(node->lchild); //求node

的左子树的深度

depthr=GetDepth(node->rchild); //求node

的右子树的深度

return depthl>=depthr?1+depthl:1+depthr;

}

}

int CBinaryTree::GetLeafCount(Node *node)

{

int n,m;

if(node==NULL)

return 0; // 如果二叉树是空树,则返回 0

else if((node->lchild==NULL) &&

(node->rchild==NULL))

return 1; //

如果二叉树的左孩子和右孩子均为空,则返回

1

else // 如果二叉树的左孩子或右孩子不为空

{

n=GetLeafCount(node->lchild); //

求左子树的叶子结点数目

m=GetLeafCount(node->rchild); //

求右子树的叶子结点数目

return n+m; // 返回总的叶子结点数目

}

}

void CBinaryTree::ChangeLeftRight(Node *node)

{

if(node!=NULL)

{

ChangeLeftRight(node->lchild);

ChangeLeftRight(node->rchild);

Node*temp=node->lchild;

node->lchild=node->rchild;

node->rchild=temp;

}

}

void CBinaryTree::Visit(Node *node)

{ //访问结点

cout<data<

}

void CBinaryTree::Destroy()

{ //销毁二叉树

Destroy(root);

root=NULL;

if(head)

delete head;

head=NULL;

}

void CBinaryTree::Destroy(Node *node)

{

if(node!=NULL)

{

Destroy(node->lchild);

Destroy(node->rchild);

delete node;

node=NULL;

}

}

分享:

喜欢

0

赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

后一篇 >游戏名称

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值