一、二叉树的递归遍历

二叉树的递归遍历.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//二叉树的结点
typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild;
}BinaryNode;void Recursion(BinaryNode* root)
{if (root == NULL)  //退出条件return;//先序遍历printf("%c", root->ch);  //访问根结点Recursion(root->lchild);  //左子树遍历Recursion(root->rchild);  //右子树遍历//中序遍历/*Recursion(root->lchild);printf("%c ", root->ch);Recursion(root->rchild);*///后序遍历/*Recursion(root->lchild);Recursion(root->rchild);printf("%c ", root->ch);*/
}void CreateBinaryTree()
{/*A/ \B   F\   \C   G/ \  /D   E H*///创建结点BinaryNode node1 = { 'A',NULL,NULL };  //字符需用''  字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;//递归遍历Recursion(&node1);
}int main()
{CreateBinaryTree();return 0;
}

运行结果:

二、求二叉树的叶子结点数

求二叉树的叶子结点数.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//二叉树的结点
typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild;
}BinaryNode;
int num = 0;
void CaculateLeafNum(BinaryNode* root)
{if (root == NULL)  //退出条件return;if (root->lchild == NULL && root->rchild == NULL){num++;}CaculateLeafNum(root->lchild);  //左子树遍历CaculateLeafNum(root->rchild);  //右子树遍历
}void CaculateLeafNum(BinaryNode* root,int *pNum)
{if (root == NULL)  //退出条件return;if (root->lchild == NULL && root->rchild == NULL){(*pNum)++;}CaculateLeafNum(root->lchild,pNum);  //左子树遍历CaculateLeafNum(root->rchild,pNum);  //右子树遍历
}void CreateBinaryTree()
{/*A/ \B   F\   \C   G/ \  /D   E H*///创建结点BinaryNode node1 = { 'A',NULL,NULL };  //字符需用''  字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;//叶子结点个数/*CaculateLeafNum(&node1);printf("叶子结点数:%d",num);*/int leafNum = 0;CaculateLeafNum(&node1, &leafNum);printf("叶子结点数:%d", leafNum);}int main()
{CreateBinaryTree();return 0;
}

运行结果:

三、求树的高度

求树的高度.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//二叉树的结点
typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild;
}BinaryNode;int getTreeHeight(BinaryNode* root)
{if (root == NULL)  //退出条件return 0;//求出左子树的高度int lheight = getTreeHeight(root->rchild);//求出右子树的高度int rheight = getTreeHeight(root->lchild);//取左子树和右子树中最大值+1int height = lheight > rheight ? lheight + 1 : rheight + 1;return height;
}void CreateBinaryTree()
{/*A/ \B   F\   \C   G/ \  /D   E H*///创建结点BinaryNode node1 = { 'A',NULL,NULL };  //字符需用''  字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;//求树的高度int height = getTreeHeight(&node1);printf("树的高度:%d\n", height);}int main()
{CreateBinaryTree(); return 0;
}

运行结果:

四、二叉树的拷贝和释放

二叉树的拷贝和释放.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//二叉树的结点
typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild;
}BinaryNode;//遍历二叉树
void Recursion(BinaryNode* root)
{if (root == NULL)  //退出条件return;//先序遍历printf("%c", root->ch);  //访问根结点Recursion(root->lchild);  //左子树遍历Recursion(root->rchild);  //右子树遍历
}//拷贝二叉树
BinaryNode* CopyBinaryTree(BinaryNode* root)
{if (root == NULL)return NULL;//拷贝左子树BinaryNode* lchild=CopyBinaryTree(root->lchild);//拷贝右子树BinaryNode* rchild=CopyBinaryTree(root->rchild);//创建结点BinaryNode* newnode =(BinaryNode*) malloc(sizeof(BinaryNode));newnode->ch = root->ch;newnode->lchild = lchild;newnode->rchild = rchild;return newnode;}//释放二叉树内存
void FreeSpaceBinaryTree(BinaryNode* root)
{if (root == NULL)return;//释放左子树FreeSpaceBinaryTree(root->lchild);//释放右子树FreeSpaceBinaryTree(root->rchild);//释放当前结点FreeSpaceBinaryTree(root);
}
void CreateBinaryTree()
{/*A/ \B   F\   \C   G/ \  /D   E H*///创建结点BinaryNode node1 = { 'A',NULL,NULL };  //字符需用''  字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;BinaryNode *root = CopyBinaryTree(&node1);Recursion(root);FreeSpaceBinaryTree(root);}int main()
{CreateBinaryTree();return 0;
}

运行结果:

五、二叉树的非递归遍历

LinkList.h

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 1024
#define TRUE 1
#define FALSE 0//链表结点--存储下一个结点指针
typedef struct LINKNODE {struct LINKNODE *next;
}LinkNode;//链表--保存头结点,和链表长度
typedef struct LINKLIST {struct LINKNODE head;int size;
}LinkList;//初始化
LinkList* Init_linkList();//压入元素
void Push_LinkList(LinkList* stack, LinkNode* data);//取出栈顶元素
LinkNode*  Top_LinkList(LinkList* stack);//弹出栈顶元素
void Pop_LinkList(LinkList* stack);//判断是否为空
int IsEmpty_LinkList(LinkList* stack);//返回栈元素个数
int Size_LinkList(LinkList* stack);//清空栈元素
void Clear_LinkList(LinkList* stack);//销毁栈元素
void FreeSpace_LinkList(LinkList* stack);

LinkList.c


#include"LinkList.h"
//初始化
LinkList* Init_linkList()
{LinkList* stack = (LinkList*)malloc(sizeof(LinkList));stack->head.next = NULL;stack->size = 0;return stack;
}//压入元素
void Push_LinkList(LinkList* stack, LinkNode* data)
{if (stack == NULL){return;}if (data == NULL){return;}data->next = stack->head.next;//stack->head.next = data->next;  //问题2:没有绕对。。stack->head.next = data;stack->size++;
}//返回栈顶元素
LinkNode* Top_LinkList(LinkList* stack)
{if (stack == NULL){return NULL;}if (stack->size == 0) {return NULL;}return stack->head.next;
}//弹出栈顶元素
void Pop_LinkList(LinkList* stack)
{if (stack == NULL){return;}if (stack->size == 0) {return;}//第一个有效结点LinkNode *pNext = stack->head.next;//pNext->next = stack->head.next; 我的错误做法stack->head.next = pNext->next;stack->size--;}//判断是否为空
int IsEmpty_LinkList(LinkList* stack)
{if (stack == NULL){return -1;}if (stack->size == 0)return TRUE;return FALSE;
}//返回栈元素个数
int Size_LinkList(LinkList* stack)
{if (stack == NULL){return -1;}return stack->size;
}//清空栈元素
void Clear_LinkList(LinkList* stack)
{if (stack == NULL){return;}stack->head.next = NULL;stack->size = 0;
}//销毁栈元素
void FreeSpace_LinkList(LinkList* stack)
{if (stack == NULL){return;}free(stack);
}

二叉树的非递归遍历.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"LinkList.h"
#define MY_FALSAE 0
#define MY_TRUE 1
//二叉树的结点
typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild;
}BinaryNode;//二叉树的非递归遍历
typedef struct BITREESTACKNODE {LinkNode node;BinaryNode* root;int flag;
}BiTreeStackNode;//创建栈中结点
BiTreeStackNode* CreateBiTreeStackNode(BinaryNode* node, int flag)
{BiTreeStackNode* newnode = (BiTreeStackNode*)malloc(sizeof(BiTreeStackNode));newnode->root = node;newnode->flag = flag;return newnode;
}void NonRecursion(BinaryNode* root)
{//创建栈LinkList *stack = Init_linkList();//把根结点扔到栈里Push_LinkList(stack, (LinkNode*)CreateBiTreeStackNode(root, MY_FALSAE));while (Size_LinkList(stack) > 0){//弹出栈顶元素BiTreeStackNode* node=(BiTreeStackNode*)Top_LinkList(stack);Pop_LinkList(stack);//判断弹出的结点是否为空if (node->root == NULL){continue;}if (node->flag == MY_TRUE){printf("%c", node->root->ch);}//先序。放入顺序和遍历顺序正好相反else {//当前结点的右结点入栈Push_LinkList(stack, (LinkNode*)CreateBiTreeStackNode(node->root->rchild, MY_FALSAE));//当前结点的左结点入栈Push_LinkList(stack, (LinkNode*)CreateBiTreeStackNode(node->root->lchild, MY_FALSAE));//当前结点入栈node->flag = MY_TRUE;Push_LinkList(stack, (LinkNode*)node);}  }
}//遍历二叉树
void Recursion(BinaryNode* root)
{if (root == NULL)  //退出条件return;//先序遍历printf("%c", root->ch);  //访问根结点Recursion(root->lchild);  //左子树遍历Recursion(root->rchild);  //右子树遍历
}//二叉树的非递归遍历
void CreateBinaryTree()
{/*A/ \B   F\   \C   G/ \  /D   E H*///创建结点BinaryNode node1 = { 'A',NULL,NULL };  //字符需用''  字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;//二叉树的非递归遍历NonRecursion(&node1);
}
int main()
{CreateBinaryTree();return 0;
}

运行结果:

数据结构-树2-二叉树各种函数实现相关推荐

  1. 数据结构——树和二叉树章节思维导图

    数据结构--树和二叉树章节思维导图

  2. 数据结构-树与二叉树-思维导图+小结

    数据结构-树与二叉树-思维导图 1 数据结构-第五章-树与二叉树-思维导图 2 思维导图-补充 3 小结 3.1 知识点小结 3.2 习题小结 1 数据结构-第五章-树与二叉树-思维导图   数据结构 ...

  3. 王道——数据结构——树与二叉树(3)

    系列文章目录 其他章节相关文章 王道--数据结构--栈和队列(1) 本章节其他相关文章 王道--数据结构--树与二叉树(1) 王道--数据结构--树与二叉树(2) 王道--数据结构--树与二叉树(4) ...

  4. 数据结构—树与二叉树

    总第119篇 前言 之前谈到的线性表.栈和队列都是一对一的数据结构,但是现实中也存在很多一对多的数据结构,这篇要写的就是一种一对多的数据结构---树.全文分为如下几部分: 树的一些基本概念 树的存储结 ...

  5. C语言 数据结构 树和二叉树

    树 1.树:是n节点的有限集.树是n(n=>0)个节点的有限集. n=0时成为空树. 在任意一颗非空树中:(1)有且仅有一个称为根的节点:(2)当n>0时,其余节点可分为m(m>0) ...

  6. 数据结构-树,二叉树,森林

    树,二叉树,森林 王卓老师的数据结构课程笔记 树和二叉树 定义 结点之间有分支,具有层次关系 是n个结点的有限集. 若n = 0,称为空树: 若n > 0,则它满足如下两个条件: 有且仅有一个特 ...

  7. 数据结构树、二叉树、完全二叉树、二叉查找树、平衡二叉树、红黑树、B+树

    树.二叉树.平衡二叉树.二叉搜索树 树的前序遍历.中序遍历和后序遍历 树的前序遍历.中序遍历和后续遍历是以遍历时根所在的位置顺序命名的.层次遍历即按层从上至下,从左至右遍历即可. 前序遍历:根-> ...

  8. 数据结构--树和二叉树

    文章目录 树和二叉树 树 1.树的定义 2.树的逻辑表示 3.树的基本术语: 4.树的性质 5.树的基本运算 二叉树 二叉树的存储结构 二叉树的遍历 树和二叉树 树 1.树的定义 2.树的逻辑表示 树 ...

  9. 数据结构——树与二叉树

    树与二叉树 一.树的定义: 1.定义:树(Tree)是n(n>=0)个节点的有限集,n=0时称为"空树".在任意一棵非空树中: ⒈有且仅有一个特定的称为根(root)的节点. ...

  10. Python数据结构与算法笔记(八):数据结构——树,二叉树和AVL树

    树 class Node:def __init__(self, name, type='dir'):self.name = nameself.type = type #"dir" ...

最新文章

  1. 《c++语言导学》——1.7 常量
  2. JavaScript 简史
  3. Minor【 PHP框架】3.路由、控制器、视图
  4. 2节点CentOS7 PackStack安装Newton
  5. LinuxUNIX系统编程手册(英文版)pdf
  6. 深入互联网广告中的出价模式(中) — 智能出价模式
  7. 24小时学通Linux内核之构建Linux内核
  8. 模态对话框和非模态对话框的消息循环分析
  9. unity怎么bake地形上的植被_“烧烤”是quot;barbecuequot;,那“烤串”的英语怎么说?一定要看看!...
  10. 倍福plc有什么优点_倍福工业 PC 有哪些优点?
  11. Java基础语法(详细版)
  12. 手风琴几排簧好_四排簧手风琴适合初学者么
  13. 树莓派4B 编译安装rtl8192eu usb网卡驱动
  14. 工业网关下工业自动化设备远程监控解决方案
  15. Python爬虫-爬取常用IP代理
  16. ubuntu配置静态ip的方法
  17. java 狗带风波_狗狗风波
  18. 【JavaScript--React】本篇文章将带你体验不同于vue框架的react框架
  19. 加密听证会观点概览,美国监管首次强调Web3.0是未来
  20. 如何删除百度搜索结果_如何删除百度快照

热门文章

  1. zookeeper下载安装过程
  2. <load-on-startup>1</load-on-startup>的作用
  3. 固定 顶部_优质的阳光板温室的顶部应该如此安装,专业的人做专业的事
  4. 学习android 画板源代码,Android实现画画板案例
  5. 得力条码扫描器怎么用_广东智能物流控制系统怎么选
  6. ThreadLocal初识
  7. 一个java文件里面可以写多少个class
  8. c语言编程游戏开代码错误,[蓝桥杯][历届试题]数字游戏 (C语言代码)(兄弟们帮我看一下为什么运行错误86%)...
  9. Git初学札记(三)————创建Git版本库
  10. php post请求后端拿不到值_Ajax 提交POST后,后台php 无法获取$POST值