版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/u013497151/article/details/27967155

今天总结一下二叉树。要考离散了,求不挂!二叉树最重要的就是 建立、4种遍历方式。简单应用。怎样推断两颗二叉树是否类似

二叉树分为 :1、全然二叉树  2、满二叉树

结构性质:

1).满二叉树 高度为h ,节点数则为 2^h - 1。且叶子节点全在最下层,且叶子节点数为2^(n-1)个{n代表二叉树层数,也叫深度}

2).n个节点的 全然二叉树 深度为 int(log2n)(以2为底n的对数)+ 1。 

3).非空二叉树 叶子节点个数==双分支节点数+1

4).非空二叉树 某节点编号 n  若有左孩子,则左孩子节点 2*n,若有右孩子。则其节点编号为2*n+1

5).知道当中两种遍历方式,就可知第三种遍历方式。

6).推断俩颗二叉树是否同样,仅仅需推断他们随意俩种相相应的遍历顺序就可以

建树:

已知输入的字符为某颗二叉树的先序序列,如abcXXdeXgXXfXXX
(当中X表示空节点),建立二叉树

struct node *make()
{
char c;
node *st;
c = getchar();
if(c=='X')
st = NULL;
else
{
st = (struct node *)malloc(sizeof(struct node));
st ->data = c;//已知为先序遍历。先填充根节点
st ->left = make();//递归形式填充左分支
st->right = make();//递归形式填充左分支
}
return st;
}

遍历方式:

遍历方式非常重要,首先要知道怎样遍历,才干打出代码。如今脑海里模拟一遍

一、先序遍历
    

    1.先訪问根节点

    2.再訪问左分支

    3.再訪问右分支

上述图片二叉树的先序遍历:ABDGCEF

二、中序遍历
  
    1.先訪问左分支
    2.在訪问根节点
    3.再訪问右分支
上述图片二叉树的中序遍历:DGBAECF

三、兴许遍历

    1.先訪问左分支
    2.再訪问右分支

    3.再訪问根节点

上述图片二叉树的后序遍历:GDBEFCA

四、层次遍历

就是从每一层依照从左至右的顺序,一次遍历该层全部的节点

採用环形队列的方法,进行訪问

訪问叶子节点

上述递归示意图例如以下:

二叉树的深度

从当前节点的左右分支開始推断。谁大自增1

推断倆颗二叉树是否类似

1.全部节点的相应左右孩子都同样

2.如过 有随意俩种遍历方式同样,那么俩颗树就同样

代码模版:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
const int N = 1010;
using namespace std;
char a[100];
struct node{
char data;
node *left;
node *right;
};
struct node *make()
{
char c;
node *st;
c = getchar();
if(c=='X')
st = NULL;
else
{
st = (struct node *)malloc(sizeof(struct node));
st ->data = c;//已知为先序遍历,先填充根节点
st ->left = make();//递归形式填充左分支
st->right = make();//递归形式填充左分支
}
return st;
} void First_Order(struct node *t )//先序遍历的递归形式
{
if(t==NULL)
return ;
printf("%c -> ",t->data);
First_Order(t->left);
First_Order(t->right);
}
void First_Order_1(struct node *t)//先序遍历非递归形式
{
struct node *stk[N],*p;
int top = -1;
if(t!=NULL)
{
top++;
stk[top] = t; //根节点进栈
while(top>-1)
{
p = stk[top];//出栈并訪问该节点
top--;
printf("%c -> ",p->data);
if(p->right!=NULL) //右孩子进栈
{
top++;
stk[top] = p->right;
}
if(p->left!=NULL)//左孩子进栈
{
top++;
stk[top] = p->left;
}
}
}
}
void Mid_Order(struct node *t)//中序遍历递归形式
{
if(t==NULL)
return ;
Mid_Order(t->left);
printf("%c -> ",t->data);
Mid_Order(t->right);
} void Mid_Order_1(struct node *t)//先序遍历非递归形式
{
struct node *stk[N],*p;
int top = -1;
if(t!=NULL)
{
p = t; while(top>-1 ||p!=NULL )// 遍历左分支
{
while(p!=NULL) // 将当前t节点的左分支。全部压入栈
{
top++;
stk[top] = p;
p = p->left;
}
//while结束后。栈顶元素可能没有左分支节点或者左分支节点已经訪问完成
if(top>-1)
{
p = stk[top];//出栈 ,并打印
top--;
printf("%c -> ",p->data);
p = p->right; // 遍历右分支
}
}
}
} void Last_Order(struct node *t)//后序遍历递归形式
{
if(t==NULL)
return ;
Last_Order(t->right);
Last_Order(t->left);
printf("%c -> ",t->data);
} void Print_Leaf(struct node *t)
{
if(t!=NULL)
{
if(t->left==NULL && t->right==NULL)
{
printf("%c ",t->data);
}
Print_Leaf(t->left);//訪问左分支的叶子节点
Print_Leaf(t->right);//訪问右分支的叶子节点
}
} void Ceng_Order(struct node *t)//层次遍历,採用循环队列来实现
{
struct node *que[N],*p;
int f,r; //队列的头指针 和 尾指针
f = -1; r = -1;
que[++r] = t; //根节点入队
while(f!=r)
{
f = (f + 1)% N; //防止队溢出
p = que[f]; //队列头结点 出队
printf("%c -> ",p->data);
if(p->left !=NULL) // 将其左孩子 压入队列
{
r = (r + 1 )% N;
que[r] = p->left;
}
if(p->right !=NULL) // 将其右孩子 压入队列
{
r = (r + 1 )% N;
que[r] = p -> right;
}
}
} int shendu(struct node *t)
{
int x=0,y = 0;
if(t!=NULL)
{
x = shendu(t->left);
y = shendu(t->right); if(x>y)
return(x+1);
else
return (y+1);
}
else
return 0;
} /*bool Like(struct node *t1,struct node *t2)//推断俩颗树是否类似
{
bool like1,like2;
if(t1==NULL && t2 ==NULL)
return true; //全部相应的分支都同样
else if(t1==NULL || t2 ==NULL)
return false;
else
{
like1 = Like(t1->left,t2->left);
like2 = Like(t1->right,t2->left);
return (like1 && like2); //返回的是 like1 与 like2的 与
}
}*/ int main()
{
struct node *t;
t = make();//建树 puts("先序遍历,递归形式");
First_Order(t);
cout<<"END"<<endl<<endl;
puts("非递归形式");
First_Order_1(t);
cout<<"END"<<endl<<endl; puts("中序遍历,递归形式");
Mid_Order(t);
cout<<"END"<<endl<<endl;
puts("非递归形式");
Mid_Order_1(t);
cout<<"END"<<endl<<endl; puts("后序遍历,递归形式");
Last_Order(t);
cout<<"END"<<endl<<endl; puts("层次遍历");
Ceng_Order(t);
cout<<"END"<<endl<<endl; /* puts("推断俩个二叉树是否类似");
输入两个二叉树.....
bool m = Like(t1,t2); if(m==1)
printf("YES\n");
else
printf("NO\n");
cout<<endl;*/ puts("深度");
int du = shendu(t);
printf("%d\n",du);
puts("叶子节点为");
Print_Leaf(t);
cout<<endl<<endl; return 0;
}

二叉树总结—建树和4种遍历方式(递归&&非递归)的更多相关文章

  1. 基于Java的二叉树的三种遍历方式的递归与非递归实现

    二叉树的遍历方式包括前序遍历.中序遍历和后序遍历,其实现方式包括递归实现和非递归实现. 前序遍历:根节点 | 左子树 | 右子树 中序遍历:左子树 | 根节点 | 右子树 后序遍历:左子树 | 右子树 ...

  2. 二叉树及其三种遍历方式的实现(基于Java)

    二叉树概念: 二叉树是每个节点的度均不超过2的有序树,因此二叉树中每个节点的孩子只能是0,1或者2个,并且每个孩子都有左右之分. 位于左边的孩子称为左孩子,位于右边的孩子成为右孩子:以左孩子为根节点的 ...

  3. Map三种遍历方式

    Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...

  4. iOS开发中数组常用的五种遍历方式

    随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...

  5. lua中for循环的四种遍历方式

    lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3   key,value pairs 取每一 ...

  6. HashMap的两种遍历方式

    HashMap的两种遍历方式 HashMap存储的是键值对:key-value . java将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了Hash ...

  7. Java中List集合的三种遍历方式(全网最详)

    List集合在Java日常开发中是必不可少的,只要懂得运用各种各样的方法就可以大大提高我们开发的效率,适当活用各种方法才会使我们开发事半功倍. 我总结了三种List集合的遍历方式,下面一一来介绍. 首 ...

  8. list的四种遍历方式

    1.手先增强for循环和iterator遍历的效果是一样的,也就说 增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容.不能获 ...

  9. set的三种遍历方式-----不能用for循环遍历(无序)

    set的三种遍历方式,set遍历元素 list 遍历元素 http://blog.csdn.net/sunrainamazing/article/details/71577662 set遍历元素 ht ...

随机推荐

  1. [JZOJ5229]【GDOI2018模拟7.14】小奇的糖果

    题目 题目大意 在一个二维的平面上,有一堆有颜色的点,你需要找出一条水平线段,使得这个线段上面(或者是下面)的点的颜色不包含所有的颜色.问点数最大是多少. 思考历程 在一开始,我看错了题目大意. 题目 ...

  2. MaxCompute问答整理之8月

    本文是基于对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文.希望对大家有所帮助. 问题一.通过数据源数据增量同步后,如何查看某一条数据具体被同步到MaxCompute ...

  3. 最全Kubernetes审计日志方案

    前言 当前Kubernetes(K8S)已经成为事实上的容器编排标准,大家关注的重点也不再是最新发布的功能.稳定性提升等,正如Kubernetes项目创始人和维护者谈到,Kubernetes已经不再是 ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport[转]

      1   2{<HeadFirst设计模式>之观察者模式 }   3{ 主题与观察者                    }   4{ 编译工具 :Delphi7.0          ...

  5. 【arc072f】AtCoder Regular Contest 072 F - Dam

    题意 有一个体积为L的水池,有N天 每天早上进水Vi体积的Ti温度的水. 每天晚上可以放掉任意体积的水. 问每天中午,水池满的情况下,水温最高多少. 水的温度只受新加进的谁的影响,对于水\(W1(T1 ...

  6. Python - 基本数据类型及其常用的方法之元组

    元组 特点:一级元素无法被修改,且不能被增加或者删除. 基本操作: tu = (11, 22, ["aiden", 33, ("qwe", 11)], 77) ...

  7. Math concepts / 数学概念

    链接网址:Math concepts / 数学概念 – https://www.codelast.com/math-concepts-%e6%95%b0%e5%ad%a6%e6%a6%82%e5%bf ...

  8. 数字统计类题目的非数位DP解法

    ZJOI2010 数字统计 上题题意为求[l,r]区间中每个数字(0~9)出现的次数 一般的做法为将区间当成[0,r]-[0,l-1],然后进行数位DP 但事实上将区间当成[0,r]-[0,l-1]后 ...

  9. vue 图片上传功能

    这次做了vue页面的图片上传功能,不带裁剪功能的! 首先是html代码,在input框上添加change事件,如下:   <ul class="clearfix">   ...

  10. TZ_15Spring-Cloud_Eureka-Ribbon-Hystix-Feign-Zuul微服务整合

    1.一个微服务框架的基本流程 2.Eureka                                   --Feign-Zuul Eureka:就是服务注册中心(可以是一个集群),对外暴露 ...