二叉樹的基本操做實現,包括二叉搜索樹的判斷

#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;
}
相關文章
相關標籤/搜索