二叉树
实验内容:
(1)输入字符序列,建立二叉链表。
(2)中序遍历二叉树:递归算法。
(3)中序遍历二叉树:非递归算法。(最好也能实现先序,后序非递归算法)
(4)求二叉树的高度 。
(5)求二叉树的叶子个数。
假如有一棵树如下:

首先我们将这棵树变成完全二叉树,如下:

然后对其进行先序遍历,得到序列 :A B D # # # C E # # # (该序列将作为程序的输入)。
Tree.h 文件代码:
/*
* Author ajayumi
* Date 2008-04-23
* Description 实现树和二叉树
*/
#ifndef TREE_H
#define TREE_H
#include <iostream.h>
#include <stdio.h>
#include <Math.h>
#define ElemType char //元素类型
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef BiTree DataType;
//链式栈结构体
typedef struct node{
DataType data; //数据域
struct node *next; //节点的指针域
}StackNode;
typedef struct
{
StackNode *top; //指向头结点的指针
}LinkStack,*PLinkStack;
BiTree Init_Tree()
{
BiTree _Tree = new BiTNode();
if(_Tree)
{
return _Tree;
}
else
{cout<<"分配内存错误!"<<endl;return false;}
}
/*使用链式存储方式创建树*/
void Create_Tree(BiTree &_Tree)
{
ElemType _elem;
cout<<"请输入结点值:";
cin>>_elem;
if(_elem == '#')
{
_Tree = NULL;
}
else
{
_Tree = Init_Tree();
_Tree->data = _elem;
Create_Tree(_Tree->lchild);
Create_Tree(_Tree->rchild);
}
return;
}
/*先序遍历树*/
void Pre_Traverse(BiTree _Tree)
{
if(_Tree)
{
cout<<_Tree->data<<endl;
Pre_Traverse(_Tree->lchild);
Pre_Traverse(_Tree->rchild);
}
}
/*中序遍历树*/
void Mid_Traverse(BiTree _Tree)
{
if(_Tree)
{
Mid_Traverse(_Tree->lchild);
cout<<_Tree->data<<endl;
Mid_Traverse(_Tree->rchild);
}
}
/*后序遍历树*/
void Last_Traverse(BiTree _Tree)
{
if(_Tree)
{
Last_Traverse(_Tree->lchild);
Last_Traverse(_Tree->rchild);
cout<<_Tree->data<<endl;
}
}
/*------------------------------------------------------------------------*/
/*初始化链式栈*/
PLinkStack Init_LinkStack()
{
PLinkStack _PLinkStack = new LinkStack();
if(_PLinkStack)
{_PLinkStack->top = NULL;}
return _PLinkStack;
}
/*判断栈是否为空,为空返回True,否则返回False*/
bool isEmpty_LinkStack(PLinkStack _PLinkStack)
{
if(_PLinkStack->top == NULL)
{return true;}
else
{return false;}
}
/*将元素压栈,成功返回True,否则返回False*/
bool Push_LinkStack(PLinkStack _PLinkStack,DataType _elem)
{
StackNode *p = new StackNode(); //定义一个栈结点指针,并分配内存
if(!p)
{
cout<<"分配内存出错!"<<endl;
return false;
}
else
{
p->data = _elem; //为指针p的数据域赋值
p->next = _PLinkStack->top; //让p的指针指向_PLinkStack所指向的地址
_PLinkStack->top = p; //让_PLinkStack指向p
return true;
}
}
/*将元素出栈,并用_elem保存。成功返回True,否则返回False*/
bool Pop_LinkStack(PLinkStack _PLinkStack,DataType *_elem)
{
StackNode *p;
if(isEmpty_LinkStack(_PLinkStack) == true)
{
cout<<"栈为空,不能出栈!"<<endl;
return false;
}
else
{
*_elem = _PLinkStack->top->data;
p = _PLinkStack->top;
_PLinkStack->top = _PLinkStack->top->next;
delete p;
return true;
}
}
/*------------------------------------------------------------------------*/
/*前序遍历的非递归算法*/
void Pre_Traverse_Stack(BiTree _Tree)
{
PLinkStack _Stack = Init_LinkStack();
DataType _TempTree = _Tree;
Push_LinkStack(_Stack,NULL);
while(_TempTree != NULL)
{
cout<<_TempTree->data<<endl;
if(_TempTree->rchild != NULL)
{Push_LinkStack(_Stack,_TempTree->rchild);}
if(_TempTree->lchild != NULL)
{_TempTree = _TempTree->lchild;}
else
{
_TempTree = new BiTNode();
Pop_LinkStack(_Stack,&_TempTree);
}
}
}
/*中序遍历的非递归算法*/
void Mid_Traverse_Stack(BiTree _Tree)
{
PLinkStack _Stack = Init_LinkStack();
DataType _TempTree = _Tree;
do
{
while(_TempTree != NULL)
{
Push_LinkStack(_Stack,_TempTree);
_TempTree = _TempTree->lchild;
}
if(isEmpty_LinkStack(_Stack) == false)
{
_TempTree = new BiTNode();
Pop_LinkStack(_Stack,&_TempTree);
cout<<_TempTree->data<<endl;
_TempTree = _TempTree->rchild;
}
}while(_TempTree != NULL || isEmpty_LinkStack(_Stack) == false);
}
int NodeCount = 0;
/*求二叉树的叶子个数*/
void CountLeaf(BiTree _Tree)
{
if(_Tree)
{
CountLeaf(_Tree->lchild);
NodeCount += 1;
CountLeaf(_Tree->rchild);
}
}
/*求二叉树的高度*/
int TreeDepth(BiTree _Tree)
{
int n;
if(_Tree == NULL)
{n = 0;}
else
{
if(TreeDepth(_Tree->lchild) > TreeDepth(_Tree->rchild))
{n = TreeDepth(_Tree->lchild) +1;}
else
{n = TreeDepth(_Tree->rchild) +1;}
}
return n;
}
#endifMainFile.cpp 文件代码:
#include <iostream.h>
#include "Tree.h"
void main()
{
BiTree _Tree;
cout<<"------------------------------------"<<endl;
cout<<"建立树:"<<endl;
Create_Tree(_Tree);
cout<<"------------------------------------"<<endl;
cout<<"------------------------------------"<<endl;
cout<<"先序遍历树:"<<endl;
Pre_Traverse(_Tree);
cout<<"------------------------------------"<<endl;
cout<<"------------------------------------"<<endl;
cout<<"中序遍历树:"<<endl;
Mid_Traverse(_Tree);
cout<<"------------------------------------"<<endl;
cout<<"------------------------------------"<<endl;
cout<<"后序遍历树:"<<endl;
Last_Traverse(_Tree);
cout<<"------------------------------------"<<endl;
cout<<"------------------------------------"<<endl;
cout<<"非递归的先序遍历树:"<<endl;
Pre_Traverse_Stack(_Tree);
cout<<"------------------------------------"<<endl;
cout<<"------------------------------------"<<endl;
cout<<"非递归的中序遍历树:"<<endl;
Mid_Traverse_Stack(_Tree);
cout<<"------------------------------------"<<endl;
cout<<"------------------------------------"<<endl;
cout<<"二叉树的叶子个数:";
CountLeaf(_Tree);
cout<<NodeCount;
cout<<endl;
cout<<"------------------------------------"<<endl;
cout<<"------------------------------------"<<endl;
cout<<"二叉树的高度:";
cout<<TreeDepth(_Tree);
cout<<endl;
cout<<"------------------------------------"<<endl;
}
运行结果如下图所示:




浙公网安备 33010602011771号