二叉链表(C++引用实现)

来源:互联网 发布:java开发经验总结 编辑:程序博客网 时间:2024/05/22 15:08
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
typedef struct BiNode
{
char data;
struct BiNode *lchild , *rchild; 
}BiTree;                                   //节点(数据,左孩子,右孩子 )
void create(BiTree * &T)                     //创建二叉链表(递归算法)
{
    char ch;
if((ch = getchar()) == '#')             //按照前序遍历输入,缺少孩子用‘#’补齐
T=NULL;
    else
{
        T=(BiTree*)malloc(sizeof(BiTree));
T->data  =  ch;
create(T->lchild);                 //递归(左子树)
create(T->rchild);                 //递归(右子树)
}
}
void preorder( BiTree *p)                  //前序遍历(递归)
{
if(p)
{

cout<<p->data<<" ";
preorder(p->lchild);
preorder(p->rchild);
}


}
void inorder( BiTree *p)                  //中序遍历(递归)
{
if(p)
{
inorder(p->lchild);
cout<<p->data<<" ";
inorder(p->rchild);
}
}
void postorder( BiTree *p)                //后序遍历(递归)
{
if(p)
{
      postorder(p->lchild);
postorder(p->rchild);
cout<<p->data<<" ";
}
}
int depth(BiTree *T)                     //求深度(递归)
{
int d1 = 0 , d2 = 0 , max;
if(T)
{
d1  = depth(T->lchild);
d2  = depth(T->rchild);
max = d1 > d2 ? d1 :d2;
   return max+1;                    //体会两个return 体会max+1
}
return 0;
}
int i = 0;
void freetree(BiTree *T)                 //销毁二叉链表
{
if(T)
{
freetree(T->lchild);
   freetree(T->rchild);
free(T);
i++;
}
}
int main()                           
{
BiTree *T;
cout<<"请输入元素(先序遍历),缺少孩子的用‘#’补:"<<endl;
    create(T);
cout<<"前序遍历:";
preorder(T);            cout<<endl;       
    cout<<"中序遍历:";
inorder(T);             cout<<endl;       
cout<<"前序遍历:";
postorder(T);           cout<<endl;      
cout<<"二叉树的深度:"<<depth(T)<<endl;   
freetree(T);
cout<<"共销毁的节点:"<<i<<endl;
return 1;
}