二叉树的先序,中序,后序遍历以及线索二叉树的遍历
(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
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
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
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
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
} 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 加载中,请稍候...... 评论加载中,请稍候... 发评论 登录名: 密码: 找回密码 注册记住登录状态 昵 称: 评论并转载此博文 发评论 以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 后一篇 >游戏名称喜欢
赠金笔