二叉树的操作

来源:互联网 发布:赫鲁晓夫知乎 编辑:程序博客网 时间:2024/06/06 00:54

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。

二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。

二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:

//二叉树结点typedef struct BiTNode{//数据char data;//左右孩子指针struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;
二叉树的创建:

通过读入一个字符串,建立二叉树的算法如下

//按先序序列创建二叉树int CreateBiTree(BiTree &T){char data;//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树scanf("%c",&data);if(data == '#'){T = NULL;}else{T = (BiTree)malloc(sizeof(BiTNode));//生成根结点T->data = data;//构造左子树CreateBiTree(T->lchild);//构造右子树CreateBiTree(T->rchild);}return 0;}

二叉树的遍历:

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。

递归算法:

//输出void Visit(BiTree T){if(T->data != '#'){printf("%c ",T->data);}}//先序遍历void PreOrder(BiTree T){if(T != NULL){//访问根节点Visit(T);//访问左子结点PreOrder(T->lchild);//访问右子结点PreOrder(T->rchild);}}//中序遍历void InOrder(BiTree T){if(T != NULL){//访问左子结点InOrder(T->lchild);//访问根节点Visit(T);//访问右子结点InOrder(T->rchild);}}//后序遍历void PostOrder(BiTree T){if(T != NULL){//访问左子结点PostOrder(T->lchild);//访问右子结点PostOrder(T->rchild);//访问根节点Visit(T);}}

还有非递归算法点击打开链接

完整的程序:

#include<iostream>#include<stdlib.h>using namespace std;typedef char ElemType;typedef struct BiNode{   ElemType data;   BiNode *lchild,*rchild;}BiNode,*BiTree;int index = 0;char node[10]="AB#D##C##";void Visit(BiTree T){      if(T->data != '#'){          printf("%c ",T->data);      }  }  void CreatBiTree(BiTree *T){     ElemType ch; ch = node[index++];     if(ch =='#' )     {       *T = NULL;     }     else     {         *T = (BiTree)malloc(sizeof(BiNode));         (*T)->data = ch;         CreatBiTree(&(*T)->lchild);         CreatBiTree(&(*T)->rchild);     }}void Pre(BiTree T){  if (T != NULL)  { Visit(T);     Pre(T->lchild);     Pre(T->rchild);  }  }void InOrder(BiTree T){if (T != NULL)  {     Pre(T->lchild);  Visit(T);     Pre(T->rchild);  }}void PostOrder(BiTree T){if (T != NULL){  PostOrder(T->lchild);  PostOrder(T->rchild);  Visit(T);}}int main(){    BiTree T=NULL;    CreatBiTree(&T); //&T是指向指针的指针,因为在CreatBiTree函数中,不仅要改变指针指向的值,还需要改变指针。cout<<"先序遍历:";Pre(T);cout<<endl;cout<<"中序遍历:";InOrder(T);cout<<endl;cout<<"后序遍历:";PostOrder(T);cout<<endl;    system("pause");}

统计二叉树中叶子结点的数目:

/*******************************************//*        递归法求叶子结点个数             *//*******************************************/int LeavesNum(BiTree T){    if(T)    {        if(T->lchild==NULL&&T->rchild==NULL)        {            return 1;        }        return LeavesNum(T->lchild)+LeavesNum(T->rchild);    }    return 0;}

交换左右子树

/*******************************************//*      递归法将二叉树的左右子树互换       *//*******************************************/void Exchange(BiTree T){    BiTree temp;    if(T)    {        Exchange1(T->lchild);        Exchange1(T->rchild);        temp=T->lchild;        T->lchild=T->rchild;        T->rchild=temp;    }}


求二叉树的深度:

/**********************************************//*                  求一棵树的高度            *//**********************************************/ int Depth(BiTree T){    int  lh = rh =0 ;    BiTree p=T;    if(p==NULL)    {        return 0 ;    }    else    {        lh = Depth( p->lchild ) ;        rh = Depth( p->rchild ) ;        return ( lh > rh ? lh : rh ) + 1 ;    }}

判断两棵树是否等价

/*******************************************************//*                  判断两棵是否等价                   *//*******************************************************/ int Is_equal( BiTree T1 , BiTree T2 ){    int t=0;    if(NULL == T1 && NULL == T2)    {        t=1;    }    else    {        if(NULL !=T1 &&NULL != T2 )        {            if(T1->data == T2->data)            {                if(Is_equal(T1->lchild,T2->lchild))                {                    t=Is_equal(T1->rchild,T2->rchild);                }            }        }    }    return t;}

查找某个信息是否在这棵树中:

/****************************************************//*            查找某个信息是否在这棵树中            *//****************************************************/ BiTree Locate(BiTree T,char x){    BiTree p=T;    if(P==NULL)         return NULL;    else    {        if( P -> data == x )             return P;        else        {            p = Locate(P->lchild,x);            if(p)                return p;            else                return Locate(P->rchild,x);        }    }}


0 0
原创粉丝点击