版权声明:本文为博主原创文章,未经博主同意不得转载。 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. 设置listContrl中指定行的颜色

    在MFC中 自己通过手动拖放CListCtrl控件来制作自己的表格: 目的: 将指定item的行更该颜色: 步骤: 1,在窗口中拖放CListCtrl控件, 单击右键 创建控件对象: CListCtr ...

  2. HBase的安装与配置

  3. typescript使用小结

    1. typescript使得js在书写的过程中有了参数类型的限制在 传参的过程中变得严格,减少了不必要的错误的发生 2. tslint同时也兼备了一部分eslint的作用,在一定程度上我们使用tsl ...

  4. cookie - 提示上一次访问该网页的时间

          案例:记住上一次访问时间         1. 需求:             1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问.             2. ...

  5. org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]

    从hibernate3升级到4应该会遇到 应该添加引用 <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 ...

  6. sqlserver数据往别的数据库迁移

    背景:sqlserver数据库数据是服务于一个.net项目.后来由于去.net 要将数据前往高斯数据库 或者Oracle. 问题是 当sql Name Age Gender from student ...

  7. hbase 聚合操作

    hbase本身提供了 聚合方法可以服务端聚合操作 hbase中的CoprocessorProtocol机制. CoprocessorProtocol的原理比较简单,近似于一个mapreduce框架.由 ...

  8. 第03章 科学计算库Numpy

    016.Numpy数据结构    关于矩阵运算的库 矩阵 017.Numpy基本操作 判断每一个元素的 018.Numpy矩阵属性 019.Numpy矩阵操作 020.Numpy常用函数 按列拼接就用 ...

  9. 分布式事务 XA 两段式事务 X/open CAP BASE 一次分清

    分布式事务: 分布式事务是处理多节点上 的数据保持 类似传统 ACID 事物特性的 一种事物. XA:是一种协议,一种分布式事务的协议,核心思想是2段式提交. 1 准备阶段  2 提交阶段.XA协议是 ...

  10. Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persistence provider for EntityManager named null

    swing Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Pe ...