二叉树

      实验内容:
     (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 
*= 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;
}


#endif

MainFile.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;
}

 

运行结果如下图所示:

posted @ 2009-05-04 23:19  ajayumi  阅读(579)  评论(0)    收藏  举报