二叉树基本操作C代码
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct ChainTree)
struct ChainTree
{
int num;
struct ChainTree *left;
struct ChainTree *right;
};
/*函数功能:进行查找操作。*/
ChainTree *BinTreeFind(ChainTree *bt,int data)//在二叉树中查找值为data的结点。
{
ChainTree *p;
if(bt==NULL)
return NULL;
else
{
if(bt->num==data)
return bt;
else{
if(p=BinTreeFind(bt->left,data))
return p;
else if(p=BinTreeFind(bt->right,data))
return p;
else
return NULL;
}
}
}
/*函数功能:先序遍历。*/
void BinTree_DLR(ChainTree *bt)
{
if(bt)
{
printf("%d",bt->num);
if(bt->left)
{
BinTree_DLR(bt->left);
}
if(bt->right)
{
BinTree_DLR(bt->right);
}
}
return;
}
/*函数定义:后序遍历。*/
void BinTree_LRD(ChainTree *bt)
{
if(bt)
{
BinTree_LRD(bt->left);
BinTree_LRD(bt->right);
printf("%d",bt->num);
}
return;
}
/*函数功能:中序遍历。*/
void BinTree_LDR(ChainTree *bt)
{
if(bt)
{
BinTree_LDR(bt->left);
printf("%d",bt->num);
BinTree_LDR(bt->right);
}
return;
}
/*函数功能初始化一个二叉树,建立根节点。*/
ChainTree *InitRoot()
{
ChainTree *node;
node=(struct ChainTree*)malloc(LEN);
printf("请输入根节点的值:");
scanf("%d",&node->num);
node->left=NULL;
node->right=NULL;
return node;
} /*添加数据到二叉树*/
int BinTreeAddNode(ChainTree *bt,ChainTree *node,int n)
{
if(bt==NULL)
{
printf("\n父结点不在,请先设置父结点。");
return ;
}
switch(n)
{
case :
if(bt->left)
{
printf("左子树结点不为空。");
return ;
}
else
bt->left=node;
break;
case :
if(bt->right)
{
printf("右子树结点不为空。");
return ;
}
else
bt->right=node;
break;
default:
printf("参数错误!\n");
return ;
}
return ;
} /*函数功能:添加结点到二叉树。*/
void AddNode(ChainTree *bt)
{
int data;
int select;
ChainTree *node,*parent;
node=(struct ChainTree*)malloc(LEN);
printf("\n输入二叉树结点数据");
scanf("%d",&node->num);
node->left=NULL;
node->right=NULL;
printf("\n输入父结点数据:");
scanf("%d",&data);
parent=BinTreeFind(bt,data);
if(!parent)
{
printf("\n未找到父结点。");
}
printf("\n1.添加到左子树\n2.添加到右子树\n");
do{
scanf("%d",&select);
if(select==||select==)
BinTreeAddNode(parent,node,select);
}while(select!=&&select!=);
} /*求二叉树叶子结点个数*/
void CountLeaf(ChainTree *bt,int &count)
{
if(bt)
{
if((!bt->left)&&(!bt->right))
count++;
CountLeaf(bt->left,count);
CountLeaf(bt->right,count);
}
} /*求二叉树深度*/
int BinTreeDepth(ChainTree *bt)
{
int dep1,dep2;
if(bt==NULL)
return ;
else
{
dep1=BinTreeDepth(bt->left); //左子树深度(递归调用)
dep2=BinTreeDepth(bt->right); //右子树深度(递归调用)
if(dep1>dep2)
return dep1+;
else
return dep2+;
}
} int main()
{
struct ChainTree *p1,*p2,*head,*p3;
int select = ;
int countleaf=; //该变量计算叶子结点个数
while(select!=){
printf("\n1.设置二叉树根元素\n2.添加二叉树根节点\n3.先序遍历\n4.中序遍历\n5.后序遍历\n6.输出叶子结点个数\n7.求二叉树深度\n0.退出");
scanf("%d",&select);
switch(select)
{
case :
head=InitRoot();
break;
case :
AddNode(head);
break;
case :
BinTree_DLR(head);
break;
case :
BinTree_LDR(head);
break;
case :
BinTree_LRD(head);
break;
case :
countleaf=; //求二叉树叶子结点数
CountLeaf(head,countleaf);
printf("\n%d",countleaf);
break;
case :
printf("二叉树深度为:%d\n",BinTreeDepth(head));
break;
case :
select = ;
break;
}
}
}
二叉树基本操作C代码的更多相关文章
- c++学习笔记—二叉树基本操作的实现
用c++语言实现的二叉树基本操作,包括二叉树的创建.二叉树的遍历(包括前序.中序.后序递归和非递归算法).求二叉树高度,计数叶子节点数.计数度为1的节点数等基本操作. IDE:vs2013 具体实现代 ...
- 编程算法 - 二叉树的深度 代码(C)
二叉树的深度 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一棵二叉树的根节点, 求该树的深度. 依次选择最深的左右子树, 然后递归加1. ...
- 编程算法 - 推断二叉树是不是平衡树 代码(C)
推断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 推断该树是不是平衡二叉树. 二叉平衡树: 随意结 ...
- 二叉树基本操作C++
#include <cstdio> #include <climits> #include <cassert> #include <iostream> ...
- c语言二叉树基本操作
编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...
- [c/c++]c++控制台操作(基本操作的代码)
本文转自:http://blog.csdn.net/stude/article/details/7645056 控制台窗口界面编程控制 〇.摘要一.概述二.控制台文本窗口的一般控制步骤三.控制台窗口操 ...
- OC MRC之计数器的基本操作(代码分析)
/* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> ...
- python scrapy 基本操作演示代码
# -*- coding: utf-8 -*- import scrapy # from quotetutorial.items import QuoteItem from quotetutorial ...
- Html基本操作实例代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...
随机推荐
- 使用Spring Tool Suite (STS)新的工作空间无需再配置
在你的新的工作空间中找到比如 F:\java-wokespace\你的新的工作空间名称\.metadata\.plugins\org.eclipse.core.runtime\.settings 找到 ...
- VC++中用API调用对话框资源
关键技术: 对于资源的载入须要几个API函数,以下分别介绍这几个API函数. a) FindResource 用来在一个指定的模块中定位所指的资源,语法例如以下: HRSRC FindResource ...
- iOS 直播
待解决: 貌似苹果规定10M以内的视频可以用RTMP,以上的必须用HLS ? IOS非直播超过10分钟只能用hls,ios上有规定? 待尝试: 用Vitamion内核开发的可以自定义界面的视频播放器 ...
- 【LCA最近公共祖先】在线离线
[在线] 1.倍增法 现将深度较大的跳至与深度较小的统一深度.预处理$fa[u][i]$表示$u$往上跳$2^i$个单位后的祖先,则就可以像快速幂一样,将移动的步数化为二进制,如果第$i$位为$1$, ...
- [02]基于webservice权限系统
面前,我们已经介绍过.如何使用cxf建立webservice. 那我们要介绍的这款许可制度表结构. 此权限管理系统分为部门管理.员工管理.角色管理,权限管理,授权的人才和企业管理(这里不涉及) 角色管 ...
- linux 命令学习 —— 硬件外设管理(dmesg、lsusb)
dmesg:print or control the kernel ring buffer dmesg命令设备故障的诊断是非常重要的.在dmesg命令的帮助下进行硬件的连接或断开连接操作时,我们可以看 ...
- 自定义滚动条样式 -webkit-scrollbar
demo .page-one-content-area-inner-select-wrap height 200px margin-bottom 30px overflow auto &::- ...
- WPF动态加载3D 放大-旋转-平移
第一步:新建WavefrontObjLoader.cs using System; using System.Collections.Generic; using System.Windows; us ...
- 将grub写入mbr
现在习惯了开机启动的方法,所以我们把grub重新安装到硬盘的MBR上面. 这个步骤也有两种方法,一是安装grub4dos,然后启动,选中搜索硬盘上的linux引导文件,进入Linux之后再安装grub ...
- UVa 12657 Boxes in a Line(应用双链表)
Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your ...