• 二叉树链式存储



    前序遍历二叉树:ABDHKECFIGJ
    中序遍历二叉树:HKDBEAIFCGJ
    后序遍历二叉树:KHDEBIFJGCA

    // 二叉树的链式存储
    #include "stdlib.h"
    #include "stdio.h"
    #include "io.h"  
    #include "string.h"
    #include "math.h"
    
    #define Nil '#'
    #define ARRAY_MAXSIZE 30
    #define TRUE 1
    #define FALSE 0
    
    typedef char TElemType;
    //int index = 1;
    //typedef char String[24]; /*  0号单元存放串的长度 */
    //String str;
    // 定义数据结构
    typedef struct node
    {
    	TElemType data; // 存储的数据类型,使用别名TElemType【类型泛化】
    	struct node*lchild, *rchild; // 定义左右子树
    }BiNode, *BiTree;
    int index = 1;
    // 定义字符串
    typedef struct
    {
    	char charArray[ARRAY_MAXSIZE];
    }String;
    
    
    ///* *****通用函数***** */
    
    void initialString(String *s, const char *chars)
    {
    	if (strlen(chars) > ARRAY_MAXSIZE)
    		printf("字符溢出(字符串长度超过规定的最大长度:%d
    )", ARRAY_MAXSIZE);
    	else
    	{
    		s->charArray[0] = strlen(chars);
    		for (int i = 1; i <= s->charArray[0]; i++)
    		{
    			s->charArray[i] = *(chars +(i-1)); // 指针索引关系
    		}
    	}
    }
    
    void println(TElemType e)
    {
    	printf(" %c ", e);
    }
    
    int isEmpty(BiTree T)
    {
    	if (T) // T!=NULL, 即T不空
    		return FALSE;
    	else
    		return TRUE;
    }
    
    // 每递归一层,深度加1
    int depth(BiTree T)
    {
    	int l, r;
    	if (!T) 
    	{
    		return 0;
    	}
    	else 
    	{
    		l = depth(T->lchild);
    		r = depth(T->rchild);
    	}
    	int depth = (l > r ? l + 1 : r + 1);
    	return depth;
    }
    
    TElemType root(BiTree T)
    {
    	if (T)
    		return ' ';
    	else
    	{
    		return T->data;
    	}
    }
    
    /* *****通用函数***** */
    
    
    void initBiTree(BiTree *T)
    {
    	*T = NULL;
    }
    
    void destroyBiTree(BiTree* T)
    {
    	if (*T)
    	{
    		if ((*T)->lchild)
    			destroyBiTree(&(*T)->lchild);
    		if ((*T)->rchild)
    			destroyBiTree(&(*T)->rchild);
    		free(*T); // 释放根结点
    		*T = NULL; // 空指针赋值0
    	}
    }
    
    #define clearBiTree destroyBiTree  
    
    // - 创建二叉树
    // - 结点分类两种:
    //		1 空节点'#'
    //		2 字符结点
    // - 创建二叉树有两种方式:
    //		1 通过有序字符串创建二叉树
    //		2 用户输入创建二叉树
    void createBiTree(BiTree* T, String str)
    {
    	TElemType ch;
    	ch = str.charArray[index++];
    
    	if (ch == Nil)
    		*T = NULL;
    	else 
    	{
    		*T = (BiTree)malloc(sizeof(BiNode));
    		if (!*T)
    			exit(OVERFLOW);
    		(*T)->data = ch; /* 生成根结点 */
    		createBiTree(&(*T)->lchild, str); /* 构造左子树 */
    		createBiTree(&(*T)->rchild, str); /* 构造右子树 */
    	}
    }
    
    /* 初始条件: 二叉树T存在 */
    /* 操作结果: 前序递归遍历T */
    void preOrderTraverse(BiTree T)
    {
    	if (T == NULL)
    		return;
    	printf("%c", T->data);/* 显示结点数据,可以更改为其它对结点操作 */
    	preOrderTraverse(T->lchild); /* 再先序遍历左子树 */
    	preOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
    }
    
    /* 初始条件: 二叉树T存在 */
    /* 操作结果: 中序递归遍历T */
    void inOrderTraverse(BiTree T)
    {
    	if (T == NULL)
    		return;
    	inOrderTraverse(T->lchild); /* 中序遍历左子树 */
    	printf("%c", T->data);/* 显示结点数据,可以更改为其它对结点操作 */
    	inOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
    }
    
    /* 初始条件: 二叉树T存在 */
    /* 操作结果: 后序递归遍历T */
    void postOrderTraverse(BiTree T)
    {
    	if (T == NULL)
    		return;
    	postOrderTraverse(T->lchild); /* 先后序遍历左子树  */
    	postOrderTraverse(T->rchild); /* 再后序遍历右子树  */
    	printf("%c", T->data);/* 显示结点数据,可以更改为其它对结点操作 */
    }
    
    
    
    int main()
    {
    	BiTree T;
    	TElemType e;
    	initBiTree(&T);
    
    	String str;
    	initialString(&str, "ABDH#K###E##CFI###G#J##");
    
    	createBiTree(&T, str);
    
    	printf("构造空二叉树后,树空否?%d(1:是 0:否) 树的深度=%d
    ", isEmpty(T), depth(T));
    
    	e = root(T);
    	printf("二叉树的根为: %c
    ", e);
    
    
    	printf("
    前序遍历:");
    	preOrderTraverse(T);
    	printf("
    中序遍历:");
    	inOrderTraverse(T);
    	printf("
    后序遍历:");
    	postOrderTraverse(T);
    
    	clearBiTree(&T);
    	printf("
    清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d
    ", isEmpty(T), depth(T));
    }
    
    
  • 相关阅读:
    微信公众平台开发者中心安全模式消息体加解密实现
    AES对称加密算法原理
    Token验证失败
    PaySignKey
    UVA 11732
    lua中的pairs和ipairs差别
    【shell学习笔记】curl命令总结
    视频监控系统:C/S &amp; B/S
    Android app开发中用户协议(使用条款)文字自己主动换行
    uva 10154
  • 原文地址:https://www.cnblogs.com/neen/p/13673638.html
Copyright © 2020-2023  润新知