数据结构-树2-二叉树各种函数实现

一、二叉树的递归遍历

二叉树的递归遍历.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;
}

 

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python反射应用场景(一)

了解了反射中四个函数的基本用法。那么反射到底有什么用呢&#xff1f;它的应用场景是什么呢&#xff1f;答案是&#xff0c;当不确定所需要的属性和函数是否存在时&#xff0c;可以使用反射。另外一个重要作用是&#xff0c;可以提高代码的扩展性和可维护性。假如我们把所有的…

数据结构-树5-二叉搜索树

#include<iostream> #include<string>using namespace std; //构建二叉树的结构体 template< typename T> struct binaryTreeNode {T element; //数据binaryTreeNode<T>* leftChild; //左子树指针binaryTreeNode<T>* rightChild; //右子树指针…

oracle segment undo_71_UNDO扩展学习

UNDO扩展学习UNDO是Oracle在UNDO SEGMENT(回滚段)中记录的信息。下面使用UNDO这名字可能会包含两种意思&#xff0c;一是前面说的回滚段中的记录、二是UNDO整个机制。在这部分内容里&#xff0c;没有涉及闪回技术&#xff0c;要知道不少闪回技术是基于UNDO机制来实现的&#xf…

js判断对象是否为空对象_js对象

七种数据类型 number string bool symbol undefined null object五个Falsy 值 undefined null 0 NaN 对象 object第七种数据类型,唯一一种复杂类型定义无序的数据租户键值对的集合写法let obj {name:frank,age:18}let obj new Object({name:frank})console.log({name:frank,a…

Python字典方法

字典也有方法&#xff0c;很有用&#xff0c;但其使用频率可能没有列表和字符串方法那样高。1、clear 删除所有的字典项d {key: value} d.clear() print(d){}2、copy 方法copy返回一个新字典&#xff0c;其包含的键值对与原来的字典相同&#xff08;这各方法是浅复制&#xff…

交流充电桩电路图_直流充电桩和交流充电桩给电动汽车充电过程中是如何工作的?...

近几年来&#xff0c;新能源汽车发展越来越快&#xff0c;而限制新能源电动汽车发展的主要因素是续航里程和充电问题。续航里程要靠提高电池性能来解决&#xff0c;而解决充电问题就要靠充电桩的普及来实现。下面小编带着大家一起来了解一下直流充电桩和交流充电桩给电动汽车充…

Windows上安装Ubuntu子系统练习linux基本命令

经常在我的群里看到自学测试的小伙伴花费了大量的时间在环境搭建和各种软件的安装上面&#xff0c;有很多就卡在第一步&#xff0c;虚拟机的安装。 有很多安装之后比如启动蓝屏之类的等等&#xff0c;其实&#xff0c;我想说的是&#xff0c;这些都是在走弯路&#xff0c;在这个…

如何巧妙的申请换部门_如何设置户外广告?市城管局局长体验户外广告审批流程...

为巩固拓展“不忘初心、牢记使命”主题教育成果&#xff0c;落实“对标找差、再攀新高”工作要求&#xff0c;优化营商环境&#xff0c;提升服务品质&#xff0c;近日&#xff0c;张家港市城管局局长殷沪飞以个体工商户的身份&#xff0c;到行政审批局城管窗口体验户外广告设置…

安卓APP版本发布流程(一)

一、加固安卓包&#xff08;新版安卓Release包&#xff09;1、下载安装加固软件&#xff0c;注册登录账号https://jiagu.360.cn/#/global/index2、添加签名设置&#xff0c;对应签名路径、密码、别名、别名密码向安卓开发要3、添加签名后&#xff0c;APK加固-添加应用&#xff…

小程序弹出层禁止列表滑动_是时候展现真正的技术了!小程序教程来了——百战Web前端课程更新05.07...

百战程序员十大精品课程&#xff0c;实时更新&#xff0c;保持行业领先。本次更新课程Web前端第二十九阶段安心食疗-微信小程序全部7个章节及课程资料。小程序是依托微信而生的&#xff0c;是一种不用下载就能使用的应用&#xff0c;也是一项创新&#xff0c;经过近几年的发展&…

Jmeter实战(二)|同用户重复并发多次抢红包

之前我们有写过Jmeter多人并发抢1个红包&#xff0c;今天我们来写另外一种场景&#xff0c;同用户重复并发多次抢红包&#xff0c;两种场景还是不太一样&#xff0c;都是比较切合用户实际使用场景&#xff0c;如果1个用户在某些条件下&#xff0c;能重复领取到2次红包&#xff…

【北京上海】七猫内推,高薪海量岗位等你来~

微信长按识别、扫码&#xff0c;查看海量待招岗位&#xff01;&#xff01;&#xff01;UI、产品、测试、开发、运营、数据分析等等

Fiddler无所不能——之测试开发攻城狮必备神器

fiddler官网 https://www.progress.com/ 官网下载fiddler https://www.telerik.com/download/fiddler/fiddler4 fiddler插件下载 https://www.telerik.com/fiddler/add-ons Fiddler无所不能——之测试开发攻城狮必备神器 1、模拟真实网络环境4g网、3g网络、2g网络、弱网等​…