二叉树的四种遍历及叶子.深度
来源:互联网 发布:清风算法 编辑:程序博客网 时间:2024/04/29 13:27
二叉树http://baike.baidu.com/view/88806.htm?fr=aladdin百科
</pre></p><p></p><p><span style="font-size:24px;">三种常规遍历还有层次遍历(<span><span style="font-size:18px;"><strong>即按照层次访问,通常用</strong></span></span><a target=_blank href="http://baike.baidu.com/view/38959.htm" target="_blank"><span style="font-size:18px;"><strong>队列</strong></span></a><span><strong><span style="font-size:18px;">来做。访问根,访问子女,再访问子女的子女(越往后的层次越低)(两个子女的级别相同</span>)</strong></span>)</span></p><p><span style="font-size:24px;"><img alt="" src="http://img.blog.csdn.net/20140827152002526?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSDBzMFk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" /></span></p><p><span style="font-size:24px;">建树</span></p><p><span style="font-size:24px;">给出二叉树的先序遍历序列abc,,de,g,,f,,,</span></p><span style="font-size:24px;"></span><pre class="csharp" name="code"> node *build(struct node *t){ char x; scanf("%c",&x); if ( x != ',') { t = (struct node *)malloc (sizeof (struct node)); t -> data = x;//先加根节点 t -> l = build (t->l);//左 t -> r = build (t->r);//右 } else//','为空节点 t = NULL; return t;}
遍历方式:
遍历方式很重要,首先要知道如何遍历,才能打出代码,现在脑海里模拟一遍
一、先序遍历
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;}
0 0
- 二叉树的四种遍历及叶子.深度
- 二叉树的创建以及四种遍历,叶子结点的数量,二叉树深度(简单二叉树)
- 【数据结构】二叉树的实现(如:默认成员函数、(叶子)节点数、深度、四种遍历)
- C++二叉树的构建及求深度,叶子数量,层次遍历
- 二叉树的创建、遍历、深度、叶子节点个数
- 二叉树的创建、遍历、深度、叶子节点数
- 二叉树的遍历 深度 与叶子节点
- 二叉树的遍历,叶子数目以及深度
- 求二叉树的叶子结点个数及深度
- 中序遍历二叉树的非递归的两种实现、线序遍历统计二叉树的叶子数、二叉树的深度
- 二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度
- c语言实现二叉树先序,中序,后序(递归),层次遍历,求叶子节点个数及树的深度,下一篇写非递归的遍历
- C语言二叉树创建、遍历、深度、叶子节点
- 二叉树的操作:创建、遍历、求树的深度、叶子结点数
- 二叉树的深度、叶子数以及先、中、后、层次遍历
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- 基本数据结构——二叉树的建立,遍历,求叶子节点,深度计算
- C二叉树的基本操作---创建、遍历、求深度、求叶子结点
- 交叉编译OpenCV为静态库
- 白话压缩感知(含Matlab代码)
- 如何保持工作的热情
- Android Studio使用教程(一)
- Android图片处理:颜色矩阵和坐标变换矩阵
- 二叉树的四种遍历及叶子.深度
- Delphi与Windows 7下的用户账户控制(UAC)机制(加小盾牌),注册表没反应
- 一道很有趣的面试题
- curl传递query string参数的转义
- OpenCV基础篇之绘图及RNG随机数对象
- linux线程池的实现
- Android Studio使用教程(二)
- 八皇后问题 回溯递归 -C++
- LVM