二叉树---待完善
来源:互联网 发布:ug安装java虚拟机 编辑:程序博客网 时间:2024/05/22 10:24
myTree.h
#ifndef MYTREE_H_INCLUDED#define MYTREE_H_INCLUDED/*二叉树性质:在二叉树上的第i(i >= 1)层最多有2^(i - 1)个节点。深度为k(K >= 1)的二叉树最多有2^k - 1个节点第i层节点的序号从2^(i - 1) - 1到2^i - 1需要为i的节点的双亲的序号为(i + 1) / 2,它的左右孩子的序号为2i + 1和2i + 2*/#undef NULL#ifdef __cplusplus #define NULL 0#else #define NULL ((void *)0)#endiftypedef struct tag_myTree{ int data; struct tag_myTree* pLeft; struct tag_myTree* pRight;}myTree;//为树分配一个新节点myTree* getNewTreeNode();//初始化树的根节点void initBiTree(myTree *pTreeRoot);//销毁树----递归void destoryBiTree(myTree *pTreeRoot);//前序遍历树----递归void preOrderTraverse(myTree *pTreeRoot);//中序遍历----递归void inOrderTraverse(myTree *pTreeRoot);//后序遍历----递归void nexOrderTraverse(myTree *pTreeRoot);//获取树的深度---递归int getTreeDepth(myTree* pTreeRoot);//构造一棵树void createBiTree(myTree** pTreeRoot);#endif // MYTREE_H_INCLUDED
#include "myTree.h"void initBiTree(myTree *pTreeRoot){ //如果根节点不为空说明树在使用中,需要先销毁 if (NULL != pTreeRoot) { destoryBiTree(pTreeRoot); } pTreeRoot = NULL;}//思考如何使用循环销毁一棵树void destoryBiTree(myTree *pTreeRoot){ if (NULL != pTreeRoot) { if (NULL != pTreeRoot->pLeft) { //递归,从最后一层向上销毁左孩子 destoryBiTree(pTreeRoot->pLeft); } //能用else if 吗??? if (NULL != pTreeRoot->pRight) { destoryBiTree(pTreeRoot->pRight); } free(pTreeRoot); pTreeRoot = NULL; }}void preOrderTraverse(myTree *pTreeRoot){ if (NULL == pTreeRoot) { return; } //访问根节点 printf("%d\t", pTreeRoot->data); preOrderTraverse(pTreeRoot->pLeft); preOrderTraverse(pTreeRoot->pRight); return;}void inOrderTraverse(myTree *pTreeRoot){ if (NULL == pTreeRoot) { return; } inOrderTraverse(pTreeRoot->pLeft); //访问根节点 printf("%d\t", pTreeRoot->data); inOrderTraverse(pTreeRoot->pRight); return;}void nexOrderTraverse(myTree *pTreeRoot){ if (NULL == pTreeRoot) { return; } nexOrderTraverse(pTreeRoot->pLeft); nexOrderTraverse(pTreeRoot->pRight); //访问根节点 printf("%d\t", pTreeRoot->data); return;}int getTreeDepth(myTree* pTreeRoot){ int leftDepth; int rightDepth; if (NULL == pTreeRoot) { return 0; } if (NULL != pTreeRoot->pLeft) { leftDepth = getTreeDepth(pTreeRoot->pLeft); } else { leftDepth = 0; } if (NULL != pTreeRoot->pRight) { rightDepth = getTreeDepth(pTreeRoot->pLeft); } else { rightDepth = 0; } return ((leftDepth > rightDepth) ? leftDepth + 1 : rightDepth + 1);}myTree* getNewTreeNode(){ myTree *pNewNode = NULL; pNewNode = (myTree*)malloc(sizeof(myTree)); if (NULL == pNewNode) { return NULL; } memset(pNewNode, 0, sizeof(myTree)); return pNewNode;}void createBiTree(myTree** pTreeRoot){ int data; myTree *pTmp = NULL; scanf("%d", &data); if (0 != data) { pTmp = getNewTreeNode(); if (NULL == pTmp) { exit(0); } pTmp->data = data; *pTreeRoot = pTmp; createBiTree(&((*pTreeRoot)->pLeft)); createBiTree(&((*pTreeRoot)->pRight)); }}
main.c
#include <stdio.h>#include "myTree.h"int main(){ myTree *g_TreeRoot = NULL; createBiTree(&g_TreeRoot); printf("pre:\t"); preOrderTraverse(g_TreeRoot); printf("\nin:\t"); inOrderTraverse(g_TreeRoot); printf("\nnex:\t"); nexOrderTraverse(g_TreeRoot); return 0;}
阅读全文
0 0
- 二叉树---待完善
- 数据结构_求二叉树的宽度_C语言源代码(待完善)
- 二叉树最大宽度(递归方式和非递归方式)(待完善)
- 线索二叉树创建及中序遍历(待完善)
- 待完善。。
- 待完善
- 待完善
- 待完善
- 待完善
- 待完善
- 待完善
- splay(伸展树)笔记-待完善
- 二叉树的前序、中序、后序的递归与非递归遍历算法实现(待完善)
- 二叉树(完善中)
- 分布式通信【待完善】
- 结构设计【待完善】
- 归并算法.(待完善)
- 递归总结(待完善)
- web--资源的加载
- 关于外包公司线性盈利与软件公司规模化盈利的思考
- winform中console.write的使用、线程的产生、线程的使用、创建单例模式
- java封装
- 建立github本地仓库与远程仓库
- 二叉树---待完善
- java 注解的几大作用及使用方法详解
- Spring中基于配置文件的方式来配置AOP
- java基础-面向对象(上)
- Android控件系列之RadioButton&RadioGroup
- mybatis-映射器-resultMap结果集映射2-association一对一级联
- MyEclipse8.5破解方法
- js的数据类型和变量:
- 机器学习笔记十六:错误来源Bias和Variance