#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. 呈现样式UIModalPresentation

    nModal   n在iPhone开发中 pModal是一种常见的切换控制器的方式 p默认是从屏幕底部往上弹出,直到完全盖住后面的内容为止 n n在iPad开发中 pModal的使用频率也是非常高的 ...

  2. 编写Linux中sh文件执行时出现莫名字符的问题

    今天在项目中需要编写一个sh,执行一些初始化操作,然后调取原来的执行文件,但是我在操作中主要到了首行需要加入#!/bin/sh 的表达式,但是在执行时总是报错,原因是每次执行,表达式后边都会添加一个莫 ...

  3. js 时间日期函数

    忘记从哪里拷贝过来的了,侵删 Date.prototype.format = function (format) { var date = { "M+": this.getMont ...

  4. 数据集(benchmark)、常用数据集的解析(cifar-10、)

    What is the class of this image ? 主要是以下常见的数据集,用以衡量算法的分类准确率: mnist.cifar-10.cifar-100stl-10 svhn.ILSV ...

  5. ubuntu 16.0.4 中docker 部署 sqlserver 2017(四)

    1. 从 Docker Hub 中拉出 SQL Server 2017 Linux 容器映像 sudo docker pull mcr.microsoft.com/mssql/server:2017- ...

  6. 【23.24%】【codeforces 629C】Famil Door and Brackets

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. delphi 中的函数指针 回调函数(传递函数指针,以及它需要的函数参数)

    以下代码仅仅是测试代码:delphi XE7 UP1 interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.V ...

  8. Spring Cloud和Docker搭建微服务平台

    用Spring Cloud和Docker搭建微服务平台 This blog series will introduce you to some of the foundational concepts ...

  9. SQL SERVER配置[转]

    感谢shuhao,sql server的配置都是他教的,下面是他写的总结,方便自己以后使用 总结一下,感觉比较实用.------------------------------------------ ...

  10. 程序员,用NuGet管理好你的包包(转)

    每个女人都有很多包包:其实男人也有,但只有会写程序的男人才有 —— 代码世界中的大“包”小“包”.这些大包小包,有花钱买的,有从开源市场淘的,也有自己或同事亲手制作的. 包包有个特点:容易坏,更新快, ...