11、二叉树

二叉树

二叉树操作1

#include<stdio.h> //‘ ‘空格代表树的元素为空
#include<stdlib.h>
#define OVERFLOW -1
typedef char TElemType;
typedef struct BitNode
{
    TElemType data;
    struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
typedef struct QNode
{
    BitNode data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
void BinTreeInit(BitNode **BT)  //初始化二叉树
{
    *BT=NULL;
}
BitNode *BinTreeCreat(BitNode *BT) //按先序次序构造二叉树
{
    char c;
    scanf("%c",&c);
    if(c==‘ ‘)BT=NULL;
    else
    {
        if(!(BT=(BitTree)malloc(sizeof(BitNode))))
            exit(OVERFLOW);
        BT->data=c;
        BT->lchild=BinTreeCreat(BT->lchild); //注意因为有返回值,必须有左值
        BT->rchild=BinTreeCreat(BT->rchild);
    }
    return BT;
}
int BinTreeEmpty(BitNode *BT)//检查二叉树是否为空
{
    if(BT==NULL)return 1;
    else return 0;
}
void visit(BitNode *BT) //visit函数
{
    printf("%c",BT->data);
}
void PreOrderTraverse(BitNode *BT)//先序遍历树
{
    if(BT)
    {
    visit(BT);
    PreOrderTraverse(BT->lchild);
    PreOrderTraverse(BT->rchild);
    }
}
void InOrderTraverse(BitNode *BT)//中序遍历树
{
    if(BT)
    {
    InOrderTraverse(BT->lchild);
    visit(BT);
    InOrderTraverse(BT->rchild);
    }
}
void PostOrderTraverse(BitNode *BT)//后序遍历树
{
    if(BT)
    {
    PostOrderTraverse(BT->lchild);
    PostOrderTraverse(BT->rchild);
    visit(BT);
    }
}
void InitQueue(LinkQueue *Q) //构造一个空的队列
{
    Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
    if(!Q->front)exit(OVERFLOW);
    Q->front->next=NULL;
}
int QueueEmpty(LinkQueue *Q)
{
    if(Q->rear==Q->front)return 1;
    else return 0;
}
void EnQueue(LinkQueue *Q,BitNode e) //入队
{
    QNode *p;
    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p)exit(OVERFLOW);
    p->data=e;
    p->next=NULL;
    Q->rear->next=p;
    Q->rear=p;
}
void DeQueue(LinkQueue *Q,BitNode *e)//出队
{
    QNode *p;
    p=Q->front->next;
    *e=p->data;
    Q->front->next=p->next;
    if(Q->rear==p)Q->rear=Q->front;
    free(p);
}
void BFSTraverse(BitNode *BT)//层次遍历树
{
    BitNode m;
    LinkQueue Q;
    InitQueue(&Q);
    EnQueue(&Q,*BT);
    while(!QueueEmpty(&Q))
    {
        DeQueue(&Q,&m);
        visit(&m);
        if(m.lchild)EnQueue(&Q,*(m.lchild));
        if(m.rchild)EnQueue(&Q,*(m.rchild));
    }
}
int BinTreeDepth(BitNode *BT)//求二叉树的深度
{
    int dep1,dep2;
    if(BT==NULL)return 0;
    else
    {
        dep1=BinTreeDepth(BT->lchild);
        dep2=BinTreeDepth(BT->rchild);
        if(dep1>dep2)return 1+dep1;
        else return 1+dep2;
    }
}
void BinCountleaf(BitNode *BT,int *count)//求二叉树的叶子节点的个数
{
    if(BT)
    {
        if(!BT->lchild&&!BT->rchild)(*count)++;
        BinCountleaf(BT->lchild,count);
        BinCountleaf(BT->rchild,count);
    }
}
void BinTreeClear(BitNode **BT)//清除二叉树
{
    if(*BT)
    {
        BinTreeClear(&(*BT)->lchild);
        BinTreeClear(&(*BT)->rchild);
        free(*BT);
        *BT=NULL;
    }
}
int main()
{
    int count=0;
    BitNode *BT=NULL;
    BinTreeInit(&BT); //初始化二叉树
    BT=BinTreeCreat(BT);//构造二叉树
    printf("执行创建树操作后: ");
    if(BinTreeEmpty(BT))printf("树空\n");//判空
    else printf("树不空\n");
    printf("先序遍历二叉树: ");
    PreOrderTraverse(BT);printf("\n");
    printf("中序遍历二叉树: ");
    InOrderTraverse(BT);printf("\n");
    printf("后序遍历二叉树: ");
    PostOrderTraverse(BT);printf("\n");
    printf("层次遍历二叉树: ");
    BFSTraverse(BT);printf("\n");
    printf("二叉树的深度为:%d\n",BinTreeDepth(BT));//求二叉树的深度
    BinCountleaf(BT,&count);//求二叉树中的节点个数
    printf("二叉树的叶子节点个数为:%d\n",count);
    BinTreeClear(&BT);//清空树
    printf("执行清空树操作后: ");
    if(BinTreeEmpty(BT)==1)printf("树空\n");//判空
    else printf("树不空\n");

    return 0;
}          

 或者将构造二叉树的操作改为,main函数里对此函数的调用扫做修改即可:

void BinTreeCreat(BitNode **BT) //按先序次序构造二叉树
{
	char c;
	scanf("%c",&c);
	if(c==‘ ‘)*BT=NULL;//此处曾把‘*‘漏掉
	else
	{
		if(!((*BT)=(BitTree)malloc(sizeof(BitNode))))
			exit(OVERFLOW);
		(*BT)->data=c;
		printf("%c",(*BT)->data);
		BinTreeCreat(&(*BT)->lchild);
		BinTreeCreat(&(*BT)->rchild);
	}
}

二叉树操作2

#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"  

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100                             /* 存储空间初始分配量 */  

typedef int Status;                             /* Status是函数的类型,其值是函数结果状态代码,如OK等 */  

/**********定义二叉树的存储结构************/
typedef char TElemType;
TElemType Nil=‘ ‘;                              /* 字符型以空格符为空 */  

typedef struct BinTreeNode                      /* 结点结构 */
{
    TElemType data;                             /* 结点数据 */
    struct BinTreeNode *lchild,*rchild;         /* 左右孩子指针 */
}BinTreeNode,*BinTree;
/*****************************************/  

/***********用于构造二叉树************** */
int index=1;
//自定义了一个字符数组类型
typedef char charArray[24];                     /*声明一个char类型数组,charArray是数组名也是一个指针*/
charArray str;									//str字符数组类型的数组名,charArray等价于char *  

Status AssignStr(charArray T,char *chars)		//char *chars是字符类型的指针变量
{
    int i;
    if(strlen(chars)>MAXSIZE) return ERROR;     /*输入字符的长度超过存储空间最大值*/
    else
    {
        T[0]=strlen(chars);                     /*0号单元存放字符串长度*/
        for(i=1;i<=T[0];i++)
        {
            T[i]=*(chars+i-1);					//先将数据进行存储
        }
        return OK;
    }
}
/* ************************************* */  

/*构造二叉树*/
void CreateBinTree(BinTree *T)
{
    TElemType ch;
    ch=str[index++];  

    if(ch==‘#‘)
        *T=NULL;
    else
    {
        *T=(BinTree)malloc(sizeof(BinTreeNode));
        if(!*T)
            exit(OVERFLOW);
        (*T)->data=ch;                            /* 生成根结点 */
        CreateBinTree(&(*T)->lchild);             /* 构造左子树 */
        CreateBinTree(&(*T)->rchild);             /* 构造右子树 */
    }
}  

/* 构造空二叉树*/
Status InitBinTree(BinTree *T)
{
    *T=NULL;
    return OK;
}  

/*清空二叉树*/
void ClearBinTree(BinTree *T)
{
    if(*T)
    {
        if((*T)->lchild)                           /* 有左孩子 */
            ClearBinTree(&(*T)->lchild);           /* 销毁左孩子子树 */
        if((*T)->rchild)                           /* 有右孩子 */
            ClearBinTree(&(*T)->rchild);           /* 销毁右孩子子树 */
        free(*T);                                  /* 释放根结点 */
        *T=NULL;                                   /* 空指针赋0 */
    }
}  

/*判断二叉树是否为空*/
Status IsBinTreeEmpty(BinTree T)
{
    if(T)
        return FALSE;
    else
        return TRUE;
}  

/*计算二叉树的深度*/
int GetDepth(BinTree T)
{
    int i,j;
    if(!T)
        return 0;
    if(T->lchild)
        i=GetDepth(T->lchild);
    else
        i=0;
    if(T->rchild)
        j=GetDepth(T->rchild);
    else
        j=0;
    return i>j?i+1:j+1;
}  

/*获取二叉树的根节点*/
TElemType GetRoot(BinTree T)
{
    if(IsBinTreeEmpty(T))
        return Nil;                                 /*Nil表示空字符*/
    else
        return T->data;
}  

/*前序遍历
思路:访问根节点--->前序遍历左子树--->前序遍历右子树
*/
void PreOrderTraverse(BinTree T)
{
    if(T==NULL) return;  

    printf("%c ",T->data);                           /* 显示结点数据,可以更改为其它对结点操作 */
    PreOrderTraverse(T->lchild);                     /* 再先序遍历左子树 */
    PreOrderTraverse(T->rchild);                     /* 最后先序遍历右子树 */
}  

/*中序遍历
思路:中序遍历左子树--->访问根节点--->中序遍历右子树
*/
void InOrderTraverse(BinTree T)
{
    if(T==NULL) return;  

    InOrderTraverse(T->lchild);                       /* 中序遍历左子树 */
    printf("%c ",T->data);                            /* 显示结点数据,可以更改为其它对结点操作 */
    InOrderTraverse(T->rchild);                       /* 最后中序遍历右子树 */
}  

/*后序遍历
思路:后序遍历左子树--->后序遍历右子树--->访问根节点
*/
void PostOrderTraverse(BinTree T)
{
    if(T==NULL) return;  

    PostOrderTraverse(T->lchild);                      /* 先后序遍历左子树  */
    PostOrderTraverse(T->rchild);                      /* 再后序遍历右子树  */
    printf("%c ",T->data);                             /* 显示结点数据,可以更改为其它对结点操作 */
}  

int main()
{
    int i;
    BinTree T;
    TElemType e1;  

    /*初始化二叉树为一棵空树*/
    InitBinTree(&T);  

    /*设置字符数组用于构造二叉树*/
    AssignStr(str,"ABDH#K###E##CFI###G#J##"); 

    /*创建二叉树*/
    CreateBinTree(&T);
    printf("创建二叉树后,树空否?%d(1:是 0:否) 树的深度为:%d\n",IsBinTreeEmpty(T),GetDepth(T));  

    /*获取二叉树的根节点*/
    e1=GetRoot(T);
    printf("\n二叉树的根为: %c\n",e1);  

    /*前序遍历*/
    printf("\n前序遍历二叉树:");
    PreOrderTraverse(T);  

    /*中序遍历*/
    printf("\n中序遍历二叉树:");
    InOrderTraverse(T);  

    /*后序遍历*/
    printf("\n后序遍历二叉树:");
    PostOrderTraverse(T);  

    /*清空二叉树*/
    ClearBinTree(&T);
    printf("\n\n清除二叉树后,树空否?%d(1:是 0:否) 树的深度为:%d\n",IsBinTreeEmpty(T),GetDepth(T));
    i=GetRoot(T);
    if(!i) printf("树空,无根\n");  

    getchar();
}

  

  

时间: 2024-08-27 21:12:23

11、二叉树的相关文章

研磨数据结构与算法-11二叉树的基本操作

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

11.二叉树基本理论

一.二叉树基本概念 1.定义 二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(或称空二叉树),或者由一个根节点和两颗互不相交的.分别称为根结点的左子树和右子树的二叉树组成. 2.二叉树特点 (1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点; (2)左子树和右子树是有顺序的,次序不能任意颠倒; (3)即使树中某节点只有一颗子树,也要区分它是左子树还是右子树. 另外,二叉树具有五种基本形态: a.空二叉树;b.只有一个根结点;c.根结点只有左子树;d

Solution 11: 二叉树中节点的最大距离

问题描述 RT. 如果把二叉树看做是一张图,父子节点的连线看成是双向的,距离的定义为两个节点之间变得数目. 解决思路 求根节点的左子树的高度和右子树的高度,相加. 程序 public class MaxDistanceInTree { public int getMaxDistanceInTree(TreeNode root) { if (root == null) { return 0; } int leftHeight = getHeightOfTree(root.left); int ri

11.二叉树

python实现二叉树的数据结构: . 二叉树的排序方式: - 广度遍历(层次遍历) - 深度遍历: - 前序(根左右):把根放到最前面 - 中序(左根右):把根放到中间 - 后序(左右根):把根放到最后 class Node(): def __init__(self,item): self.item = item self.right = None self.left = None class Tree(): def __init__(self): self.root = None def a

C语言实现有序二叉树(1)

在cpp中使用的C语言 头文件 1 /* 有序二叉树 BsTree */ 2 #ifndef _BT_H 3 #define _BT_H 4 /*节点*/ 5 typedef struct BsTreeNode 6 { 7 int data;/* 数据 */ 8 struct BsTreeNode* left;/* 左子树 */ 9 struct BsTreeNode* right;/* 右子树 */ 10 }BSTREE_NODE; 11 /* 二叉树 */ 12 typedef struct

二叉树常见遍历算法

这几天在复习关于树的各种算法,做了一些题,也搜索了网上各种算法,现在来总结一下树的各种常见算法.本文涵盖: 二叉树先中后序遍历(递归&非递归)算法 层次遍历(正序&逆序&锯齿形)非递归算法 二叉树深度算法 结点总数算法 1.二叉树先序非递归遍历 //先序非递归遍历 public ArrayList<Integer> preorderTraversal2(TreeNode root) { Stack<TreeNode> stack = new Stack<

定义和实现二叉树

/* 1.节点:节点包含一个数据元素和若干点到其子树分支 2.度节点:节点的数目已成为节点的子树 3.叶节点:为0的节点称为叶结点 4.分支节点:度不为0的节点称为分支节点 5.树的度:树中全部节点的度的最大值 6.二叉树:是n(n>=0)个有限节点构成的集合.n=0的树称为空二叉树.n=1的树仅仅有一个根结点: n〉1的二叉树由一个根节点和至多两个互不相交的,分别称为左子树和右子树的子二叉树构成 二叉树不是有序树,这是由于,二叉树中某个节点即使仅仅有一个子树也要区分是左子树还是右子树: 而对于

二叉树的定义和实现

/* 1.节点:节点包括一个数据元素及若干指向其子树的分支 2.节点的度:节点所拥有的子树的个数成为该节点的度 3.叶节点:度为0的节点称为叶结点 4.分支节点:度不为0的节点称为分支节点 5.树的度:树中所有节点的度的最大值 6.二叉树:是n(n>=0)个有限节点构成的集合.n=0的树称为空二叉树:n=1的树只有一个根结点: n〉1的二叉树由一个根节点和至多两个互不相交的,分别称为左子树和右子树的子二叉树构成 二叉树不是有序树,这是因为,二叉树中某个节点即使只有一个子树也要区分是左子树还是右子

数据结构实践项目——树和二叉树(2)

本文针对数据结构基础系列(6):树和二叉树第7, 11-15课时 7 二叉树与树.森林之间的转换 11 二叉树遍历非递归算法 12 层次遍历算法 13 二叉树的构造 14 线索二叉树 15 哈夫曼树 [项目1 - 二叉树算法验证] 运行并重复测试教学内容中涉及的算法.改变测试数据进行重复测试的意义在于,可以从更多角度体会算法,以达到逐渐掌握算法的程度.使用你的测试数据,并展示测试结果,观察运行结果,以此来领会算法. (1)层次遍历算法的验证 [参考链接] (2)二叉树构造算法的验证 [参考链接]

[BinaryTree] 二叉树常考知识点

1.二叉树第i层至多有2^(i-1)个结点(i>=1). 2.深度为k的二叉树上,至多含2^k-1个结点(k>=1) 3.n0 = n2 + 1(度) 4.满二叉树:深度为k且含有2^k-1个结点的树. 5.完全二叉树:除最后一层外,每一层上的节点数均达到最大值:在最后一层上只缺少右边的若干结点. (树中所含n个结点和满二叉树中编号为1至n的结点一一对应). 6.具有n个结点的完全二叉树的深度为[log2n] + 1. 7.二叉树的链式存储表示:二叉链表.三叉链表(增加双亲指针域).双亲链表.