二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)
将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作:
1、定义树的结构体:
typedef struct TreeNode{
int data;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode;
2、创建根节点:
TreeNode *creatRoot(){
TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode));
if(NULL==root){
printf("CreatRoot is failing!\n");
return NULL;
}
root->left=NULL;
root->right=NULL;
printf("Input the data of root!\n");
scanf("%d",&root->data);
printf("Root created!\n");
return root;
}
3、申请了空间一定要记得释放空间,否则后果不堪设想
void clearTree(TreeNode * root){
if(root){
clearTree(root->left);
clearTree(root->right);
free(root);
}
}
4、选择插入的节点是根节点的左孩子还是右孩子
void addSubTreeNode(TreeNode* root,TreeNode*node,int select){
if(NULL==root){
printf("Root is NULL\n");
return ;
}
switch(select){
case :
if(root->left){
printf("The root has left subtree!\n");
return ;
}else{
root->left=node;
break;
}
case :
if(root->right){
printf("The root has right subtree!\n");
return ;
}else{
root->right=node;
break;
}
default:
printf("The input of select is wrong!\n");
}
}
5、二叉树的前序、中序、后序遍历
void DLR(TreeNode * root){
if(NULL==root)
return;
printf("The First root input %d\n",root->data);
DLR(root->left);
DLR(root->right);
} void LDR(TreeNode * root){
if(NULL==root)
return;
LDR(root->left);
printf("The Middle root input %d\n",root->data);
LDR(root->right);
} void LRD(TreeNode * root){
if(NULL==root)
return;
LRD(root->left);
LRD(root->right);
printf("The Last root input %d\n",root->data);
}
6、求二叉树的深度
int lengthTree(TreeNode *root){
int lenLeft,lenRight;
if(NULL==root)
return ;
else{
lenLeft=lengthTree(root->left);
lenRight=lengthTree(root->right);
if(lenLeft<lenRight)
return lenRight+;
else
return lenLeft+;
}
}
7、查找节点,这里是为了初始化构建二叉树时选择的函数,目的是找出你要插入节点的父亲节点
TreeNode *treeFind(TreeNode *node,int number){
TreeNode *p;
if(NULL==node)
return NULL;
else{
if(node->data==number){
return node;
}else{
if(p=treeFind(node->left,number)){
printf("Parent found!\n");
return p;
} else if(p=treeFind(node->right,number)){
printf("Parent found!\n");
return p;
}
else
return NULL;
}
}
}
8、找到父亲节点后,选择是插入做孩子还是右孩子
void addNode(TreeNode *root){
TreeNode *node,*parent;
int number,select;
printf("Please input the parent data!\n");
scanf("%d",&number);
parent=treeFind(root,number);
if(NULL==parent){
printf("parent is not found!\n");
return ;
}
printf("Please choice the operation: 0 Exit; 1 insert left subtree; 2 insert right subtree!\n");
scanf("%d",&select);
if(select==)
return ;
if(node=(TreeNode*)malloc(sizeof(TreeNode))){
printf("Please input the data of BinTreeData that you want to insert!\n");
scanf("%d",&node->data);
node->left=NULL;
node->right=NULL;
switch(select){
case :
addSubTreeNode(parent,node,);
break;
case :
addSubTreeNode(parent,node,);
break;
}
}
}
9、二叉树的层次遍历
void levelFind(TreeNode * root){
TreeNode *node;
TreeNode *Queue[MAX];
int head,tail;
head=tail=;
if(root==NULL){
printf("Queue is empty!\n");
return ;
}
if((tail+)%MAX!=head)
Queue[tail++]=root;
else
printf("Queue is full!\n");
if(head!=tail)
node=Queue[head++];
else
printf("Queue is empty!\n");
printf("The bintree level find is: \n");
while(NULL!=node){
printf("%d ",node->data);
if(node->left!=NULL){
Queue[tail++]=node->left;
}
if(node->right!=NULL){
Queue[tail++]=node->right;
}
if(head==tail){
printf("Queue is empty!\n");
return;
}
node=Queue[head++];
}
}
10、主函数
int main(){
TreeNode *root=NULL;
int n;
do{
printf("1 set root, 2 addNode, 3 the First root input, 4 the Middle root input, 5 the last root input, 6 according to level find, 7 caculate the depth, 0 exit!\n");
scanf("%d",&n);
switch(n){
case :
break;
case :
if(NULL==root)
root=creatRoot();
else
printf("The root is exist!\n");
break;
case :
addNode(root);
break;
case :
DLR(root);
break;
case :
LDR(root);
break;
case :
LRD(root);
break;
case :
levelFind(root);
break;
case :
printf("the depth of tree is %d\n",lengthTree(root));
break;
}
}while(n!=);
clearTree(root);
printf("Tree are cleared all!\n");
getch();
return ; }
二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)的更多相关文章
- java实现二叉树的相关操作
import java.util.ArrayDeque; import java.util.Queue; public class CreateTree { /** * @param args */ ...
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...
- 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序
接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...
- 前序+中序->后序 中序+后序->前序
前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...
- 给出 中序&后序 序列 建树;给出 先序&中序 序列 建树
已知 中序&后序 建立二叉树: SDUT 1489 Description 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input 输入数据有多组,第一行是一个整数t (t& ...
- 【C&数据结构】---关于链表结构的前序插入和后序插入
刷LeetCode题目,需要用到链表的知识,忽然发现自己对于链表的插入已经忘得差不多了,以前总觉得理解了记住了,但是发现真的好记性不如烂笔头,每一次得学习没有总结输出,基本等于没有学习.连复盘得机会都 ...
- 【11】-java递归和非递归二叉树前序中序后序遍历
二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...
随机推荐
- CSS编写指导规范和建议
在参与规模庞大.历时漫长且参与人数众多的项目时,所有开发者遵守如下规则极为重要: 保持 CSS 易于维护 保持代码清晰易懂 保持 CSS 的可拓展性 为了实现这一目标,我们要采用诸多方法. 本文档第一 ...
- thinkphp 使用原生mysql语句 联合查询
<?php class DelAction extends Action { public function ml(){ // 实例化一个空模型,没有对应任何数据表 $Dao = M(); // ...
- Resource接口,及资源
Resource介绍 编码的时候,除了代码本身,我们还需要对外部的资源进行处理.例如:URL资源.URI资源.File资源.ClassPath相关资源.服务器相关资源(VFS等)等等. 而这些资源的处 ...
- AMD和RequireJS初识----优化Web应用前端(按需动态加载JS)
RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的RequireJS压缩后只有14K,堪称非常轻量.它还同时可以和其他的框架协同工作,使用Re ...
- Labview按钮的机械动作
LabVIEW 对于按钮控件的机械动作提供了六个不同的选择,它们可以通过右键按钮并选择机械动作来找到.这些不同的选项导致按钮输出的值的行为不同.下里将这六个选项做一个简短的总结: 单击时转换当用鼠标将 ...
- CleanMyMac 4破解版-最强中文版_破解版_激活码_注册码
最新版CleanMyMac 4中文版本已经发布了,也受到了广大用户的喜爱.众所周知, 注册码是开启软件的钥匙,在获取软件安装包之后需要有效的注册码才能激活软件.但是关于CleanMyMac 4注册码的 ...
- PHP大量数据循环时内存耗尽问题的解决方案
最近在开发一个PHP程序时遇到了下面的错误:PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted错误信息显...分析: ...
- nuget修改配置文件
https://www.cnblogs.com/seejoy/p/8093837.html 然后将文件解压到需要打包的工程解决方案根目录下. 然后修改nuget文件夹下的 UploadNupkg.ex ...
- CentOS7.1 Liberty云平台之Dashboard篇(7)
控制节点: 一.安装及配置Dashboard 1.安装dashboard相关包 yum install openstack-dashboard 2.配置/etc/openstack-dashboard ...
- 超全面的JavaWeb笔记day14<用户注册登录>
案例:用户注册登录 要求:3层框架,使用验证码 1 功能分析 l 注册 l 登录 1.1 JSP页面 l regist.jsp Ø 注册表单:用户输入注册信息: Ø 回显错误信息:当注册失败时,显示错 ...