二叉树叶子节点及深度
2017-04-13 15:35
761 查看
#include "stdio.h"
#include <iostream>
#include <queue>
#include <stack>
#include "malloc.h"
#include "math.h"
#define OK 1
#define error 0
#define fuyi -1
//#define OVERFLOW -2
#define maxqsize 100 // 最大队列长度(对于循环队列,最大队列长度要减1)
#define stacksize2 100 // 存储空间初始分配量
#define stackadd 10 // 存储空间分配增量
//typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
//typedef int ElemType;
using namespace std;
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
int create(BiTree &T, int n)
{
int i, e, loop=1;
BiTree s1, s2;
for (i = 1; i <= n; i++){
loop = 1;
scanf("%d",&e);
if (!(s1 = (BiTNode*)malloc(sizeof (BiTNode))))//分配
return error;
s1->data = e; s1->lchild = NULL; s1->rchild = NULL;//设置左右子树为空
s2 = T;
if (s2 == NULL){//第一次进入
T = s1;
}
else
while(loop){//构建排序二叉树
if (s1->data< s2->data){//小于现在节点,进入左子树
if (s2->lchild==NULL){
s2->lchild = s1;//左子树为空,则定位;
loop = 0;
}
else
s2 = s2 ->lchild;//左子树不为空,则继续比较
}
else if (s2->rchild == NULL){//大于等于现节点,进入右子树,右子树为空,则定位
s2->rchild = s1;
loop = 0;
}
else
s2 = s2->rchild;//不为空,继续比较;
}
}
return OK;
}
int Insert(BiTree T)
{
BiTree S1, S2;
int e;
scanf("%d",&e);
if(!(S2 = (BiTNode *)malloc(sizeof(BiTNode))))
return error;
S2->data = e;
S2->lchild = NULL;
S2->rchild = NULL;
S1 = T;
while (T){
if (S1->data<=S2->data)
if(!S1 -> rchild)
{S1 -> rchild = S2;return OK;}
else S1 = S1->rchild;
else
if(!S1 -> lchild)
{S1 -> lchild = S2;return OK;}
else S1 = S1->lchild;
}
T = S2;
return OK;
}
int Search(BiTree T, int e)
{
BiTree S;
S = T;
while(S){
if (S->data < e){
S = S->rchild;
}
else if (S->data >e){
S = S->lchild;
}
else return OK;
}
return error;
}
int Visit(int e)
{
printf("%d ",e);
return OK;
}
int pre( BiTree T, int(*Visit)(int) ) {
if(T)
{
if(Visit(T->data))
if(pre(T->lchild , Visit))
if(pre(T->rchild , Visit))
return OK;
return error;
}
else return OK;
}
int in( BiTree T, int(*Visit)(int) ) {
if(T)
{
if(in(T->lchild , Visit))
if(Visit(T->data))
if(in(T->rchild , Visit))
return OK;
return error;
}
else return OK;
}
int post( BiTree T, int(*Visit)(int) ) {
if(T)
{if(post(T->lchild , Visit))
if(post(T->rchild , Visit))
if(Visit(T->data))
return OK;
return error;
}
else return OK;
}
int pre2( BiTree T, int(*Visit)(int) ) {
if(T)
{
if(Visit(T->data))
if(pre2(T->rchild , Visit))
if(pre2(T->lchild , Visit))
return OK;
return error;
}
else return OK;
}
int in2( BiTree T, int(*Visit)(int) ) {
if(T)
{
if(in2(T->rchild , Visit))
if(Visit(T->data))
if(in2(T->lchild , Visit))
return OK;
return error;
}
else return OK;
}
int post2( BiTree T, int(*Visit)(int) ) {
if(T)
{if(post2(T->rchild , Visit))
if(post2(T->lchild , Visit))
if(Visit(T->data))
return OK;
return error;
}
else return OK;
}
int NewInOrder(BiTree T)
{
BiTree S1;
stack<BiTree> s;
S1 = T;
while (S1||!s.empty()){
while (S1!=NULL){//如果不为空,一直往左子树走;
s.push(S1);
S1 = S1->lchild;
}
if (!s.empty()){
S1 = s.top();
s.pop();
cout<<S1->data<<" ";
S1 = S1->rchild;
}
}
return OK;
}
int Level(BiTree T)
{
BiTree S1;
S1 = T;
queue<BiTree> q;
q.push(S1);
while(!q.empty()){
cout << q.front()->data << " ";//遍历对头节点
if (q.front()->lchild != NULL)//如果对头节点有左孩子,将左孩子入队
q.push(q.front()->lchild);
if (q.front()->rchild != NULL)//如果对头节点有右孩子,将右孩子入队
q.push(q.front()->rchild);
q.pop();//将已经遍历过的节点出队
}
return OK;
}
int depth(BiTNode *T)
{
int left = 0;
int right = 0;
int deep = 0;
if (T == NULL){
return deep;
}
left = depth(T->lchild);
right = depth(T->rchild);
deep = left>right?left:right;
deep++;
return deep;
}
int leave(BiTree T)
{
static int num=0;
if(T==NULL)
{
return num;
}
if(T->lchild==NULL&&T->rchild==NULL)
{
num++;
}
leave(T->lchild);
leave(T->rchild);
return num;
}
int main() //主函数
{
BiTree T=NULL;
int n;
int e;
scanf("%d", &n);
if(!create(T,n))
return error;
pre( T, Visit );
printf("\n");
in( T, Visit);
printf("\n");
post( T, Visit );
printf("\n");
scanf("%d",&e);
printf("%d\n",Search(T,e));
scanf("%d",&e);
printf("%d\n",Search(T,e));
Insert(T);
pre( T, Visit );
printf("\n");
in( T, Visit);
printf("\n");
post( T, Visit );
printf("\n");
NewInOrder( T );
printf("\n");
Level( T );
printf("\n");
pre2( T, Visit );
printf("\n");
in2( T, Visit);
printf("\n");
post2( T, Visit );
printf("\n");
pre( T, Visit );
printf("\n");
in( T, Visit);
printf("\n");
post( T, Visit );
printf("\n");
printf("%d\n",depth(T));
printf("%d\n",leave(T));
return 0;
}
#include <iostream>
#include <queue>
#include <stack>
#include "malloc.h"
#include "math.h"
#define OK 1
#define error 0
#define fuyi -1
//#define OVERFLOW -2
#define maxqsize 100 // 最大队列长度(对于循环队列,最大队列长度要减1)
#define stacksize2 100 // 存储空间初始分配量
#define stackadd 10 // 存储空间分配增量
//typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
//typedef int ElemType;
using namespace std;
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
int create(BiTree &T, int n)
{
int i, e, loop=1;
BiTree s1, s2;
for (i = 1; i <= n; i++){
loop = 1;
scanf("%d",&e);
if (!(s1 = (BiTNode*)malloc(sizeof (BiTNode))))//分配
return error;
s1->data = e; s1->lchild = NULL; s1->rchild = NULL;//设置左右子树为空
s2 = T;
if (s2 == NULL){//第一次进入
T = s1;
}
else
while(loop){//构建排序二叉树
if (s1->data< s2->data){//小于现在节点,进入左子树
if (s2->lchild==NULL){
s2->lchild = s1;//左子树为空,则定位;
loop = 0;
}
else
s2 = s2 ->lchild;//左子树不为空,则继续比较
}
else if (s2->rchild == NULL){//大于等于现节点,进入右子树,右子树为空,则定位
s2->rchild = s1;
loop = 0;
}
else
s2 = s2->rchild;//不为空,继续比较;
}
}
return OK;
}
int Insert(BiTree T)
{
BiTree S1, S2;
int e;
scanf("%d",&e);
if(!(S2 = (BiTNode *)malloc(sizeof(BiTNode))))
return error;
S2->data = e;
S2->lchild = NULL;
S2->rchild = NULL;
S1 = T;
while (T){
if (S1->data<=S2->data)
if(!S1 -> rchild)
{S1 -> rchild = S2;return OK;}
else S1 = S1->rchild;
else
if(!S1 -> lchild)
{S1 -> lchild = S2;return OK;}
else S1 = S1->lchild;
}
T = S2;
return OK;
}
int Search(BiTree T, int e)
{
BiTree S;
S = T;
while(S){
if (S->data < e){
S = S->rchild;
}
else if (S->data >e){
S = S->lchild;
}
else return OK;
}
return error;
}
int Visit(int e)
{
printf("%d ",e);
return OK;
}
int pre( BiTree T, int(*Visit)(int) ) {
if(T)
{
if(Visit(T->data))
if(pre(T->lchild , Visit))
if(pre(T->rchild , Visit))
return OK;
return error;
}
else return OK;
}
int in( BiTree T, int(*Visit)(int) ) {
if(T)
{
if(in(T->lchild , Visit))
if(Visit(T->data))
if(in(T->rchild , Visit))
return OK;
return error;
}
else return OK;
}
int post( BiTree T, int(*Visit)(int) ) {
if(T)
{if(post(T->lchild , Visit))
if(post(T->rchild , Visit))
if(Visit(T->data))
return OK;
return error;
}
else return OK;
}
int pre2( BiTree T, int(*Visit)(int) ) {
if(T)
{
if(Visit(T->data))
if(pre2(T->rchild , Visit))
if(pre2(T->lchild , Visit))
return OK;
return error;
}
else return OK;
}
int in2( BiTree T, int(*Visit)(int) ) {
if(T)
{
if(in2(T->rchild , Visit))
if(Visit(T->data))
if(in2(T->lchild , Visit))
return OK;
return error;
}
else return OK;
}
int post2( BiTree T, int(*Visit)(int) ) {
if(T)
{if(post2(T->rchild , Visit))
if(post2(T->lchild , Visit))
if(Visit(T->data))
return OK;
return error;
}
else return OK;
}
int NewInOrder(BiTree T)
{
BiTree S1;
stack<BiTree> s;
S1 = T;
while (S1||!s.empty()){
while (S1!=NULL){//如果不为空,一直往左子树走;
s.push(S1);
S1 = S1->lchild;
}
if (!s.empty()){
S1 = s.top();
s.pop();
cout<<S1->data<<" ";
S1 = S1->rchild;
}
}
return OK;
}
int Level(BiTree T)
{
BiTree S1;
S1 = T;
queue<BiTree> q;
q.push(S1);
while(!q.empty()){
cout << q.front()->data << " ";//遍历对头节点
if (q.front()->lchild != NULL)//如果对头节点有左孩子,将左孩子入队
q.push(q.front()->lchild);
if (q.front()->rchild != NULL)//如果对头节点有右孩子,将右孩子入队
q.push(q.front()->rchild);
q.pop();//将已经遍历过的节点出队
}
return OK;
}
int depth(BiTNode *T)
{
int left = 0;
int right = 0;
int deep = 0;
if (T == NULL){
return deep;
}
left = depth(T->lchild);
right = depth(T->rchild);
deep = left>right?left:right;
deep++;
return deep;
}
int leave(BiTree T)
{
static int num=0;
if(T==NULL)
{
return num;
}
if(T->lchild==NULL&&T->rchild==NULL)
{
num++;
}
leave(T->lchild);
leave(T->rchild);
return num;
}
int main() //主函数
{
BiTree T=NULL;
int n;
int e;
scanf("%d", &n);
if(!create(T,n))
return error;
pre( T, Visit );
printf("\n");
in( T, Visit);
printf("\n");
post( T, Visit );
printf("\n");
scanf("%d",&e);
printf("%d\n",Search(T,e));
scanf("%d",&e);
printf("%d\n",Search(T,e));
Insert(T);
pre( T, Visit );
printf("\n");
in( T, Visit);
printf("\n");
post( T, Visit );
printf("\n");
NewInOrder( T );
printf("\n");
Level( T );
printf("\n");
pre2( T, Visit );
printf("\n");
in2( T, Visit);
printf("\n");
post2( T, Visit );
printf("\n");
pre( T, Visit );
printf("\n");
in( T, Visit);
printf("\n");
post( T, Visit );
printf("\n");
printf("%d\n",depth(T));
printf("%d\n",leave(T));
return 0;
}
相关文章推荐
- 二叉树 遍历|统计叶子节点|求深度|交换左右子树|查找是否存在某个特定叶子节点练习题
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 二叉树的创建、遍历、深度、叶子节点数
- 基本数据结构——二叉树的建立,遍历,求叶子节点,深度计算
- 【数据结构】二叉树的实现(如:默认成员函数、(叶子)节点数、深度、四种遍历)
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 二叉树的字符串创建和遍历,求深度,叶子节点数
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 二叉树系列(建树,前序,中序,后序,中序非递归,深度,叶子数,节点数)
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 二叉树,递归、非递归遍历,求深度,输出叶子节点
- 二叉树 (Binary Tree)相关题目(求总节点数 叶子节点数 深度 第k层节点数)
- 先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)c语言
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 2013-03-17---二叉树递归,非递归实现(附代码)深度,叶子节点数量,逐行打印二叉树
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 求二叉树最高叶子节点的深度
- 求二叉树叶子节点的最浅深度