二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(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递归和非递归二叉树前序中序后序遍历
二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...
随机推荐
- WCF(二)
摘自:http://www.cnblogs.com/yank/p/3666271.html WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK ...
- thinkphp 第一个设计总结
1.thinkphp的无限级分类不是万能的... 2.感觉先看前台(根据前台设计数据库)后写控制代码(后台),速度或许会快一点,思路明确...
- 修改 ueditor1_4_3-utf8-php 它的图片上传地址
本来是这样的 至少应该是在,myapp目录下吧,从myapp文件夹,我的网站才刚开始啊...你让我将来怎么设置?麻烦... 找到uploader的文件 $rootPath = $_SERVER['DO ...
- Spring 4 官方文档学习(十)数据访问之DAO支持
1.介绍 Spring 中 Data Access Object (DAO)支持 的目标是以一种一致的方式更简单的使用JDBC.Hibernate.JPA或JDO等数据访问技术.可以在前面说的几种数据 ...
- MODEL-View-Controller,既模型-视图-控制器
Swing组件采用MVC(MODEL-View-Controller,既模型-视图-控制器)设计模式,其中模型(Model)用于维护组件的各种状态,视图(View)是组件的可视化表现,控制器(Cont ...
- Python使用paramiko库远程安全连接SSH
#!/usr/bin/python #ssh import paramiko import sys,os host='127.0.0.1' user = 'whl' password = ' s = ...
- Oracle Net Manager 服务命名配置以及用PL/SQL 登陆数据库
我们知道,要连接一个数据库需要知道四个参数: 1. 登陆用户名:user: 2. 登录密码:password: 3. 存放数据库的服务器地址(server_ip)和端口(server_port): 4 ...
- jQuery-处理class属性
1.addClass方法 为每个匹配的元素添加指定的样式类名 参数类型说明: 1)class名称(字符串) 每个匹配元素添加的一个或多个用空格隔开的样式名 2)function(index, curr ...
- 关于Bundle
1. 黄色的文件夹,打包的时候,不会建立目录,主要保存程序文件 - 素材不允许重名 2. 蓝色的文件夹,打包的时候,会建立目录,可以分目录的存储素材文件 - 素材可以重名 - 游戏的场景,backgr ...
- asp.net线程批量导入数据时通过ajax获取执行状态
最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入sessi ...