浅谈二叉树(待补充...)

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;

typedef int TreeData;
typedef struct node{
    TreeData data;
    struct node * leftChild,* rightChild;
}BinTreeNode;//二叉树结点

typedef BinTreeNode* BinTree;

void PreOrder(BinTree T){
    if(T!=NULL){
        cout << T->data << " " ;
        PostOrder(T->leftChild);
        PostOrder(T->rightChild);
    }
}//前序遍历

void InOrder(BinTree T){
    if(T!=NULL){
        PostOrder(T->leftChild);
        cout << T->data << " " ;
        PostOrder(T->rightChild);
    }
}//中序遍历

void PostOrder(BinTree T){
    if(T!=NULL){
        PostOrder(T->leftChild);
        PostOrder(T->rightChild);
        cout << T->data << " " ;
    }
}//后续遍历

bool PreCreateBiTree(BinTree &T){
    int value;
    cin >> value;
    if(value==-1) T=NULL;
    else{
        if(!(T=(BinTree)malloc(sizeof(BinTreeNode))))
            return false;
        T->data=value;
        PreCreateBiTree(T->leftChild);
        PreCreateBiTree(T->rightChild);
    }
    return true;
}//由前序遍历重构二叉树(条件是空结点值为-1)

BinTree Copy(BinTree T){
    if(T==NULL) return NULL;
    BinTree NewNode;
    if(!(NewNode=(BinTree)malloc(sizeof(BinTreeNode))))
        return 0;
    NewNode->data=T->data;
    NewNode->leftChild=Copy(T->leftChild);
    NewNode->rightChild=Copy(T->rightChild);
    return NewNode;
}//复制二叉树

int NodeNumber(BinTree T){
    if(!T) return 0;
    else return 1+NodeNumber(T->leftChild)+NodeNumber(T->rightChild);
}//计算节点个数(法1)

void CountNode(BinTree T,int n){
    if(T){
        n++;
        CountNode(T->leftChild,n);
        CountNode(T->rightChild,n);
    }
}//计算节点个数(法2)

int Leaf_Count(BinTree T){
    if(!T) return 0;
    else if(!T->leftChild&&!T->rightChild)return 1;
    else return Leaf_Count(T->leftChild)+Leaf_Count(T->rightChild);
}//求叶子节点个数

int Height(BinTree T){
    if(T==NULL) return 0;
    else{
        int l=Height(T->leftChild);
        int r=Height(T->rightChild);
        return(l>r)?l+1:r+1;
    }
}//求二叉树的高度

int FindIndex(int In[],int InStart,int InEnd,int data){
    for(int i=InStart;i<InEnd+1;i++)
        if(In[i]==data)
            return i;
    return -1;
}//查找相应数值在中序遍历的下标

BinTree Pre_In_ReCreateTree(int Pre[],int In[],int PreStart,int PreEnd,int InStart,int InEnd){
    BinTree root;
    if(PreStart>PreEnd || InStart>InEnd)
        root=NULL;
    root->data=Pre[PreStart];
    int r=FindIndex(In,InStart,InEnd,Pre[PreStart])-InStart;
    root->leftChild=Pre_In_ReCreateTree(Pre,In,PreStart+1,PreStart+r,InStart,InStart+r-1);
    root->rightChild=Pre_In_ReCreateTree(Pre,In,PreStart+r+1,PreEnd,InStart+r+1,InEnd);
    return root;
}//由前序遍历和中序遍历重构二叉树

BinTree Post_In_ReCreateTree(int Post[],int In[],int PostStart,int PostEnd,int InStart,int InEnd){
    BinTree root;
    if(PostStart>PostEnd || InStart>InEnd)
        root=NULL;
    root->data=Post[PostEnd];
    int r=FindIndex(In,InStart,InEnd,Post[PostEnd])-InStart;
    root->leftChild=Post_In_ReCreateTree(Post,In,PostStart,PostStart+r-1,InStart,InStart+r-1);
    root->rightChild=Post_In_ReCreateTree(Post,In,PostStart+r,PostEnd-1,InStart+r+1,InEnd);
}//由后序遍历和中序遍历重构二叉树

int main()
{
}

 

posted @ 2021-04-27 23:56  wind_bell  阅读(71)  评论(0)    收藏  举报