二叉树的基本操作实现,包括二叉搜索树的判断

#include<iostream>
using namespace std;

//定义节点
typedef struct node
{
    struct node *lchild;
    struct node *rchild;
    int data;
}BiTreeNode, *BiTree;     //*BiTree的意思是给 struct node*起了个别名,叫BiTree,故BiTree为指向节点的指针。


//按照前序顺序建立二叉树
void createBiTree(BiTree &T) //&的意思是传进来节点指针的引用,括号内等价于 BiTreeNode* &T,目的是让传递进来的指针发生改变
{                        
int c;
cin >> c;
if(0 == c)             //当遇到#时,令树的根节点为NULL,从而结束该分支的递归
T = NULL;
else
{
    T = new BiTreeNode;
    T->data=c;
    createBiTree(T->lchild);
    createBiTree(T->rchild);
}
}

bool judgeSortT(BiTree  T)//判断是否为排序树
{
    bool lj;
    if(!T)
        return 1;
    lj=judgeSortT(T->lchild);//左子树判断
    if(T->lchild && T->lchild->data>T->data)
            lj=0;
    
    if(T->rchild && T->data>T->rchild->data)
            lj=0;
    return lj && judgeSortT(T->rchild);//T的左子树及其当前结点T均符合要求则对右子树进行判断
}

void dispLeaf(BiTree  T,int lev)//显示叶子结点
{
    if(T)
    {
        dispLeaf(T->lchild,lev+1);
        if(!T->lchild && !T->rchild)
            cout<<T->data<<'\t'<<lev<<endl;
        dispLeaf(T->rchild,lev+1);
    } 
}

//前序遍历二叉树并打印
void preTraverse(BiTree T)
{
    if(T)
    {
        cout<<T->data<<" ";
        preTraverse(T->lchild);
        preTraverse(T->rchild);
    }
}
//中序遍历二叉树并打印
void midTraverse(BiTree T)
{
    if(T)
    {
        midTraverse(T->lchild);
        cout<<T->data<<" ";
        midTraverse(T->rchild);
    }
}
//后续遍历二叉树并打印
void postTraverse(BiTree T)
{
    if(T)
    {
        postTraverse(T->lchild);
        postTraverse(T->rchild);
        cout<<T->data<<" ";
    }
}
int main()
{
    BiTree T;               //声明一个指向二叉树根节点的指针               
    createBiTree(T);
    cout<<"二叉树创建完成!"<<endl;

   // cout<<"前序遍历二叉树:"<<endl;
    //preTraverse(T);
    //cout<<endl;
    cout<<"中序遍历二叉树:"<<endl;
    midTraverse(T);
    cout<<"排序树"<<judgeSortT(T)<<endl;
    dispLeaf(T,1);
    //  cout<<endl;
    // cout<<"后序遍历二叉树:"<<endl;
  //  postTraverse(T);
    return 0;
}

 

posted on 2018-11-29 15:45  ewitt  阅读(200)  评论(0编辑  收藏  举报

导航