数据结构之二叉树的各种运算

#include <iostream>
#include <malloc.h>
#define MaxSize 100
using namespace std;
typedef struct node
{
    char data;
    struct node *lchild;
    struct node *rchild;
} BTNode;
void CreateBTNode(BTNode *&b,char *str)
{
    BTNode *St[MaxSize],*p=NULL;
    int top=-1,k,j=0;
    char ch;
    b=NULL;
    ch=str[j];
    while (ch!='\0')
    {
        switch(ch)
        {
        case '(':
            top++;
            St[top]=p;
            k=1;
            break;
        case ')':
            top--;
            break;
        case ',':
            k=2;
            break;
        default:
            p=(BTNode *)malloc(sizeof(BTNode));
            p->data=ch;
            p->lchild=p->rchild=NULL;
            if (b==NULL)
                b=p;
            else
            {
                switch(k)
                {
                case 1:
                    St[top]->lchild=p;
                    break;
                case 2:
                    St[top]->rchild=p;
                    break;
                }
            }
        }
        j++;
        ch=str[j];
    }
}
BTNode * FindNode(BTNode *b,char x)
{
    BTNode *p;
    if (b==NULL)
    {
        return NULL;
    }
    else if (b->data==x)
    {
        return b;
    }
    else
    {
        p=FindNode(b->lchild,x);
        if (p!=NULL)
            return p;
        else
            return FindNode(b->rchild,x);
    }

}
BTNode *LchildNode(BTNode *p)
{
    return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
    return p->rchild;
}
int BTNodeHeight(BTNode *b)
{
    int lchildh,rchildh;
    if (b==NULL)
        return 0;
    else
    {
        lchildh=BTNodeHeight(b->lchild);
        rchildh=BTNodeHeight(b->rchild);
        return (lchildh>rchildh)?(lchildh+1):(rchildh+1);
    }
}
void DispBTNode(BTNode *b)
{
    if(b!=NULL)
    {
        cout<<b->data;
        if (b->lchild!=NULL||b->rchild!=NULL)
        {
            cout<<"(";
            DispBTNode(b->lchild);
            if (b->rchild!=NULL)
                cout<<",";
            DispBTNode(b->rchild);
            cout<<")";
        }
    }
}

int BTWidth(BTNode *b)  //求二叉树b的宽度
{
    struct
    {
        int lno;		//节点的层次编号
        BTNode *p;		//节点指针
    } Qu[MaxSize];		//定义顺序非循环队列
    int front,rear;							//定义队首和队尾指针
    int lnum,max,i,n;
    front=rear=0;							//置队列为空队
    if (b!=NULL)
    {
        rear++;
        Qu[rear].p=b;						//根节点指针入队
        Qu[rear].lno=1;						//根节点的层次编号为1
        while (rear!=front)					//队列不为空
        {
            front++;
            b=Qu[front].p;					//队头出队
            lnum=Qu[front].lno;
            if (b->lchild!=NULL)			//左孩子入队
            {
                rear++;
                Qu[rear].p=b->lchild;
                Qu[rear].lno=lnum+1;
            }
            if (b->rchild!=NULL)			//右孩子入队
            {
                rear++;
                Qu[rear].p=b->rchild;
                Qu[rear].lno=lnum+1;
            }
        }
        max=0;
        lnum=1;
        i=1;
        while (i<=rear)
        {
            n=0;
            while (i<=rear && Qu[i].lno==lnum)
            {
                n++;
                i++;
            }
            lnum=Qu[i].lno;
            if (n>max) max=n;
        }
        return max;
    }
    else
        return 0;
}
int Nodes(BTNode *b)
{
    int num1,num2;
    if (b==NULL)
        return 0;
    else if (b->lchild==NULL && b->rchild==NULL)
        return 1;
    else
    {
        num1=Nodes(b->lchild);
        num2=Nodes(b->rchild);
        return (num1+num2+1);
    }
}
int LeafNodes(BTNode *b)
{
    int num1,num2;
    if (b==NULL)
        return 0;
    else if (b->lchild==NULL && b->rchild==NULL)
        return 1;
    else
    {
        num1=LeafNodes(b->lchild);
        num2=LeafNodes(b->rchild);
        return (num1+num2);
    }
}
void DestroyBTNode(BTNode *&b)
{
    if (b!=NULL)
    {
        DestroyBTNode(b->lchild);
        DestroyBTNode(b->rchild);
        free(b);
    }
}

int main()
{
    BTNode *b,*p,*lp,*rp;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
    cout<<"(1)输出二叉树:";
    DispBTNode(b);
    cout<<endl;
    cout<<"(2)输出H节点的左右孩子节点值:"<<endl;
    p=FindNode(b,'H');
    if (p!=NULL)
    {
        lp=LchildNode(p);
        if (lp!=NULL)
            cout<<"左孩子为:"<<lp->data<<endl;
        else
            cout<<"无左孩子"<<endl;
        rp=RchildNode(p);
        if (rp!=NULL)
            cout<<"右孩子为:"<<rp->data<<endl;
        else
            cout<<"无左孩子"<<endl;
    }
    cout<<"(3)输出二叉树b的深度:"<<BTNodeHeight(b)<<endl;
    cout<<"(4)输出二叉树b的宽度:"<<BTWidth(b)<<endl;
    cout<<"(5)输出二叉树b的节点个数:"<<Nodes(b)<<endl;
    cout<<"(6)输出二叉树b的叶子节点个数:"<<LeafNodes(b)<<endl;
    cout<<"释放二叉树.";
    DestroyBTNode(b);
    return 0;
}

时间: 2024-10-17 10:54:00

数据结构之二叉树的各种运算的相关文章

数据结构之二叉树的遍历汇总

声明:小弟写博客不久,主要是边上班边学习边写博客,如果错误,望各位包涵并指导. 二叉树是一种常用的非线性数据结构,二叉树是由一个根节点和称为根的左.右子树的两颗互不相交的二叉树构成.二叉树具有一些特殊的性质,如第i层上最多有2^(i-1)个结点.二叉树的链式存储结构如下: typedef struct BTNode { char data; //字符型数据; struct BTNode* lChild,*rChild; //左右子结点的指针; }BTNode,*BiTree; data为二叉树中

数据结构:二叉树的链式存储

数据结构:二叉树的链式存储(C语言版) 1.写在前面 二叉树同样有两种存储方式,数组和链式存储,对于数组来说,我们利用二叉树的性质然后利用下标可以方便的找到一个节点的子节点和父节点. 二叉树的性质: 1.二叉树的第i层上至多有2i-1个节点 2.深度为K的二叉树至多有2k-1个节点 3.任何一个二叉树中度数为2的节点的个数必度数为0的节点数目少1. 说明:度数为0,为叶子节点. 4.具有n个节点的完全二叉树的深度为|_Log2N_|+1 5.若完全二叉树中的某节点编号为i,则若有左孩子编号为2i

数据结构之二叉树查找

数据结构之--二叉树查找 定义:它是一棵树,或者具有以下性质的树.  若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值:  它的左.右子树也分别为二叉排序树: 图解: ?        ?    ?    ?    ?    ?? #include<stdio.h> #include<stdlib.h> typedef int Status; #define TRUE 1 #define FALSE 0 t

数据结构之二叉树遍历

二叉树的 二叉树节点的描述 public class BiTNode { char data; BiTNode lc,rc; } 下面我们分别用递归和非递归实现前.中.后序遍历,以及使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组队列,分别使用了front和rear两个数组的下标来表示入队与出队. 1.前序遍历 未完待续... 数据结构之二叉树遍历,布布扣,bubuko.com

【算法与数据结构】二叉树 中序线索

中序线索二叉树 /************************************************************************ 线索二叉树 二叉树的节点有五部分构造 ----------------------------------------- | lChild | lTag | value | rTag | rChild | ----------------------------------------- lChild = (lTag == 0 ? 左

【算法与数据结构】二叉树的 中序 遍历

前一篇写了二叉树的先序遍历,本篇记录一下二叉树的中序遍历,主要是非递归形式的中序遍历. 由于距离上篇有好几天了,所以这里把二叉树的创建和存储结构也重复的写了一遍. 二叉树如下 二叉树的存储方式依然是二叉链表方式,其结构如下 typedef struct _tagBinTree { unsigned char value; struct _tagBinTree* left; struct _tagBinTree* right; }BinTree, *PBinTree; 先序递归形式的创建二叉树代码

采用栈数据结构的二叉树遍历

[前言]树的遍历,根据访问自身和其子节点之间的顺序关系,分为前序,后序遍历.对于二叉树,每个节点至多有两个子节点(特别的称为左,右子节点),又有中序遍历.由于树自身具有的递归性,这些遍历函数使用递归函数很容易实现,代码也非常简洁.借助于数据结构中的栈,可以把树遍历的递归函数改写为非递归函数. 在这里我思考的问题是,很显然,循环可以改写为递归函数.递归函数是否借助栈这种数据结构改写为循环呢.因为函数调用中,call procedure stack 中存储了流程的 context,调用和返回相当于根

python环境下使用mysql数据及数据结构和二叉树算法(图)

python环境下使用mysql数据及数据结构和二叉树算法(图):1 python环境下使用mysql2使用的是 pymysql库3 开始-->创建connection-->获取cursor-->操作-->关闭cursor->关闭connection->结束45 代码框架6 import pymysql.cursors7 ###连接数据库8 connection = pymysql.connect(host='127.0.0.1',port=3306,user='roo

【数据结构】二叉树的java实现

二叉树概述 数组.向量.链表都是一种顺序容器,它们提供了按位置访问数据的手段.而很多情况下,我们需要按数据的值来访问元素,而不是它们的位置来访问元素.比如有这样一个数组int num[3]={1,2,3},我们可以非常快速的访问数组中下标为2的数据,也就是说我们知道这个数据的位置,就可以快速访问.有时候我们是不知道元素的位置,但是却知道它的值是多少.假设我们有一个变量,存放在num这个数组中,我们知道它的值为2,却不知道它下标是多少,也就是说不知道它的位置.这个时候再去数组中访问这个元素就比较费