1. 程式人生 > >二叉樹的建立(不使用類),查詢,求樹高

二叉樹的建立(不使用類),查詢,求樹高

 <程式碼>

#include<iostream>
#include<queue>
using namespace std;
//建立節點
struct Tnode
{
    char data;//資料域
    Tnode *rchild;//右孩子
    Tnode *lchild;//左孩子
};
//建立二叉樹
void CreatTree(Tnode *&T)//遞迴建樹
{
    char a;
    cin>>a;
    if(a!='#')//#號表示為空
    {
        T=new Tnode();//加小括號的作用<分配記憶體並初始化>,去之會產生野指標
        T->data=a;
        CreatTree(T->lchild);//生成左子樹
        CreatTree(T->rchild);//生成右子樹
    }
}
//前序遍歷
void PreOder(Tnode *root)
{
    if(root)
    {
        cout<<root->data<<" ";//輸出父親節點
        PreOder(root->lchild);//輸出左子樹
        PreOder(root->rchild);//輸出右子樹
    }
}
//中序遍歷
void InOder(Tnode *root)
{
    if(root)
    {
    InOder(root->lchild);
    cout<<root->data<<" ";
    InOder(root->rchild);
    }
}
//後序遍歷
void PosOder(Tnode *root)
{
    if(root)
    {
        PosOder(root->lchild);
        PosOder(root->rchild);
        cout<<root->data<<" ";
    }
}
//層序遍歷
//採用佇列輸出一節點的同時將其左右孩子入隊,重複操作直至佇列為空
void LeverOder(Tnode *root)
{
    if(root)
    {
        queue<Tnode*> Q;
        Q.push(root);
        while(!Q.empty())
        {
            Tnode *q=Q.front();
            Q.pop();
            cout<<q->data<<" ";
            if(q->lchild!=NULL) Q.push(q->lchild);
            if(q->rchild!=NULL) Q.push(q->rchild);
        }
    }
}
//樹高
int Depth(Tnode *root)
{
    if(root==NULL) return 0;
    int ldeep=Depth(root->lchild)+1;//計算左子樹高度並加1
    int rdeep=Depth(root->rchild)+1;//計算右子樹高度並加1
    return ldeep>rdeep?ldeep:rdeep;//返回最大高度
}
//中序查詢節點
Tnode *InOderSearch(Tnode *root,char s)
{
    if(root)
    {
        if(s==root->data) return root;//節點即為所找
        Tnode *l=NULL;
        l=InOderSearch(root->lchild,s);//在左子樹上查詢
        if(l) return l;
        Tnode *r=NULL;
        r=InOderSearch(root->rchild,s);//在右子樹上查詢
        if(r) return r;
        if(!l&&!r) return NULL;//不存在s
    }
}
//查詢葉子節點
void searchLeaf(Tnode *r)
{
    if(r)
    {
        if(!r->lchild&&!r->lchild) cout<<r->data<<" ";//如果左右子樹為空則輸出節點
        else
        {
            searchLeaf(r->lchild);//遍歷左子樹
            searchLeaf(r->rchild);//遍歷右子樹
        }
    }
}
//main函式
int main()
{
    Tnode *Root=NULL;
    Tnode *p=NULL;
    char d;
    CreatTree(Root);
    cout<<endl<<"前序遍歷:";
    PreOder(Root);
    cout<<endl<<"中序遍歷:";
    InOder(Root);
    cout<<endl<<"後序遍歷:";
    PosOder(Root);
    cout<<endl<<"層序遍歷:";
    LeverOder(Root);
    cout<<endl<<"樹高:";
    cout<<Depth(Root);
    cout<<endl<<"輸出葉子節點:";
    searchLeaf(Root);
    cout<<endl<<"輸入要查詢的節點:";
    cin>>d;
    p=InOderSearch(Root,d);
    if(p)  cout<<"Yes"<<endl;//查詢成功
    else cout<<"No"<<endl;//查詢失敗
    return 0;
}

截圖: