#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代码的更多相关文章

  1. c++学习笔记—二叉树基本操作的实现

    用c++语言实现的二叉树基本操作,包括二叉树的创建.二叉树的遍历(包括前序.中序.后序递归和非递归算法).求二叉树高度,计数叶子节点数.计数度为1的节点数等基本操作. IDE:vs2013 具体实现代 ...

  2. 编程算法 - 二叉树的深度 代码(C)

    二叉树的深度 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一棵二叉树的根节点, 求该树的深度. 依次选择最深的左右子树, 然后递归加1. ...

  3. 编程算法 - 推断二叉树是不是平衡树 代码(C)

    推断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 推断该树是不是平衡二叉树. 二叉平衡树: 随意结 ...

  4. 二叉树基本操作C++

    #include <cstdio> #include <climits> #include <cassert> #include <iostream> ...

  5. c语言二叉树基本操作

    编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...

  6. [c/c++]c++控制台操作(基本操作的代码)

    本文转自:http://blog.csdn.net/stude/article/details/7645056 控制台窗口界面编程控制 〇.摘要一.概述二.控制台文本窗口的一般控制步骤三.控制台窗口操 ...

  7. OC MRC之计数器的基本操作(代码分析)

    /* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> ...

  8. python scrapy 基本操作演示代码

    # -*- coding: utf-8 -*- import scrapy # from quotetutorial.items import QuoteItem from quotetutorial ...

  9. Html基本操作实例代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

随机推荐

  1. Color the ball(杭电1556)

    Color the ball Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Tota ...

  2. 20+ 个很有用的 jQuery 的 Google 地图插件 (英语)

    20+ 个很有用的 jQuery 的 Google 地图插件 (英语) 一.总结 一句话总结:英语提上来我才能快速去google上面找资源啊.google上面的资源要比百度丰富很多,然后有了英语就可以 ...

  3. 【t077】宝物筛选

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物--这下小FF可发财了.但是这里的宝物实在是太多 ...

  4. php取两位小数的几种方法

    php取两位小数的几种方法 一.总结 一句话总结: 1.round   四舍五入 2.sprintf   c语言方式 3.number_format 千分位数字格式化的那个函数 二.php取两位小数的 ...

  5. list数组归并去重

    C#两路list数组归并去重 个相同类型已排序数据进行合并,虽然list数组中有AddRange方法,但它只是把第二个数组从第一个数组末尾插入,假如两个数组有重复数据,保存进去.还有Union方法合并 ...

  6. DYNAMIC CONTEXT SWITCHING BETWEEN ARCHITECTURALLY DISTINCT GRAPHICS PROCESSORS

    FIELD OF INVENTION This invention relates to computer graphics processing, and more specifically to ...

  7. 解决gdb 调试 core 文件函数名显示为问号的问题

    关于gdb调试core文件总是一堆问号的问题 问题描写叙述:已经在编译选项中增加了-g,可是查看core文件时.还是一堆问号,使用的命令为:gdb -c core 解决方式:因为gdb -c core ...

  8. Delphi新手跟我学写CALL,附完整原程序

    在开始进入正题前先罗嗦几句: 1.本人也刚学Delphi不久,也刚通过<诛仙>游戏的绝大部分CALL不久.所以在以下所说所列举的例子并不算是名门正中的写法,如有不当,请各位原谅. 2.本人 ...

  9. tomcat启动时自动加载一个类 MyServletContextListener

    目的: 我们知道在tomcat启动后,需要页面请求进行驱动来执行操作接而响应.我们希望在tomcat启动的时候能够自动运行一个后台线程,以处理我们需要的一些操作.因此需要tomcat启动时就自动加载一 ...

  10. 在Windows中安装MinGW-w64(有图,一步一步)

    在Windows中安装MinGW-w64 发表回复 如需配合Sublime Text 3编译C程序, 请参考本站文章: 使用Sublime Text 3与MinGW-w64编译C语言程序 MinGW, ...