先序遍历

二叉树的前序、中序、后序遍历(递归、非递归)实现

寵の児 提交于 2019-12-17 08:37:21
本文部分来源于CSDN 兰亭风雨 大牛的原创。链接为 http://blog.csdn.net/ns_code/article/details/12977901 因为感觉大牛讲的很好,所以这里的文字讲解采用大牛的,大家可以直接看原创!代码部分是我自己的,leetcode代码,可在leetcode Accepted 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的)。下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍历方式的非递归实现 一、三种遍历方式的递归实现(比较简单,这里不详细讲解) 1、先序遍历——按照“根节点-左孩子-右孩子”的顺序进行访问 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution {

二叉树结构的建立与遍历

坚强是说给别人听的谎言 提交于 2019-12-14 07:50:24
#include <stdio.h> #include <stdlib.h> #define MAX_LEN 50 /*二叉树的二叉链表结构*/ typedef struct node { struct node *lchild; struct node *rchild; char data; }BTREE; /*栈的数组实现*/ typedef struct { int top; BTREE *a[MAX_LEN]; //结构体数组,每个元素均为一个结点 }Stack; /*队列的数组实现*/ typedef struct { BTREE *a[MAX_LEN]; //结构体数组,每个元素均为一个结点 int front; int rear; }Queue; /*为栈分配空间*/ Stack *Createstack() { Stack *p; p = (Stack *)malloc(sizeof(Stack)); p->top = -1; return p; } /*为队列分配空间*/ Queue *Createqueue() { Queue *p; p = (Queue *)malloc(sizeof(Queue)); p->front = 0; p->rear = 0; return p; } /*菜单*/ int Menu() { int x; printf("\n\n"

数据结构之树

时光怂恿深爱的人放手 提交于 2019-12-14 07:26:28
数据结构之树(含代码) 树的基本概念 子树的个数没有限制,但它们一定是互不相交的 树的结点包含一个数据元素及若干指向其子树的分支;结点拥有的子树数称为结点的度;度为0的结点称为叶结点或终端结点;度不为0的结点称为非终端结点或分支结点;除根结点之外,分支结点也称为内部结点;树的度是树内各结点的度的最大值。 结点的层次从根开始定义起;树中结点的最大层次称为树的深度或高度; 如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树 双亲表示法 每个结点都有data和left,right,data是数据,存储结点的数据信息;而lef,rig是指针,存储该结点的双亲在数组中的下标;根结点没有双亲,所以指针域为-1; 二叉树 二叉树是n个结点的有限集合,该集合或者为空集,或者由一个根结点和两棵互不相交的、分别成为根结点的左子树和右子树的二叉树组成 二叉树的特点: 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点 左子树和右子树是有顺序的,次序不能任意颠倒 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树 满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上 特点: 叶子只能出现在最下一层 非叶子结点的度一定是2 在同样深度的二叉树中,满二叉树的结点个数最多,子树最多 完全二叉树

二叉树的遍历总结

人走茶凉 提交于 2019-12-11 04:45:37
二叉树的遍历总结 前序遍历[leetcode144] 遍历方式:“根结点-左孩子-右孩子” 递归(Recursive) /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public : vector < int > preorderTraversal ( TreeNode * root ) { vector < int > res , left , right ; if ( ! root ) return res ; res . push_back ( root - > val ) ; left = preorderTraversal ( root - > left ) ; for ( auto & x : left ) res . push_back ( x ) ; right = preorderTraversal ( root - > right ) ; for ( auto & x : right ) res . push_back ( x ) ;

二叉树遍历算法

霸气de小男生 提交于 2019-12-11 04:30:56
试题描述 :“遍历算法应用”的算法在计算机上调通(加上主函数) 程序的初始二叉树: # include <bits/stdc++.h> using namespace std ; int count = 0 ; typedef struct node * Tree ; struct node { int element ; Tree left ; Tree right ; int Height ; } ; int getHeight ( Tree T ) { if ( T ) return T - > Height ; return - 1 ; } Tree insertTree ( Tree T , int element ) { if ( ! T ) { T = ( Tree ) malloc ( sizeof ( struct node ) ) ; T - > element = element ; T - > left = NULL ; T - > right = NULL ; } else { if ( T - > element < element ) T - > right = insertTree ( T - > right , element ) ; else if ( T - > element >= element ) T - > left =

【题解】求后序遍历

给你一囗甜甜゛ 提交于 2019-12-09 14:21:06
题目描述 输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。 输入输出格式 输入格式: 共两行: 第一行为一个字符串,表示树的先序遍历; 第二行为一个字符串,表示树的中序遍历。 树的结点一律用小写字母表示。 输出格式: 一行,表示树的后序遍历序列。 输入输出样例 输入样例: abdec dbeac 输出样例: debca 这道题就是一道简单的模板题 首先可以设置一个index索引表,存放这棵树的每个字母在前序遍历中排哪个位置 可以这么想: 先在前序遍历中找出根,就是在index表中最小的那一个 然后就可以把这棵树的根找出来,分为两个子树 如图: 然后递归这个做法就可以了! 附代码: #include<iostream> #include<string> using namespace std; string pre,mid; int index[127]; void dfs(int low,int high) { if(low>high) return; int min=2147483647,root=0; for(register int i=low;i<=high;++i) { if(index[mid[i]]<=min) { min=index[mid[i]]; root=i; } } dfs(low,root-1); dfs(root+1,high); cout<

数据结构 树(上)

不打扰是莪最后的温柔 提交于 2019-12-08 05:02:32
数据结构 树(上) 一、概述   主要内容包含树的基本概念、二叉树(平衡二叉树、完全二叉树、满二叉树)、搜索树(二叉搜索树、平衡搜索树、AVL树、伸展树、(2,4)树、红黑树)、(a,b)树、B树等实际运用的树数据结构 二、基本知识(树的定义和属性) 1、树(非线性数据结构)运用于一些算法实现的效率会比线性数据结构(基于数组的列表和链表)快,广泛运用于文件系统目录结构、图形用户界面、MySQL数据库索引、网站、路由协议和其他计算机系统中 2、树T定义为存储一系列元素的有限节点集合,这些节点具有 parent-children 关系且满足属性:一、如果树T不为空,则它一定具有一个称为根节点 r 的特殊节点,并且该节点没有父节点;二、每个非根节点 v 都具有唯一的父节点 w ,每个具有父节点 w 的节点都是节点 w 的一个孩子 3、一个没有孩子的节点 v 称为外部节点或者叶子节点,一个有一个或多个孩子的节点 v 称为内部节点 4、树的边:一对具有父子关系的节点(u,v);树的路径:一系列节点,这些节点中任意两个连续的节点都具有父子关系 5、节点P的祖先:从根节点到该节点P所经路径上的所有节点;节点P的子孙:以该节点P为根节的子树中任意一个节点都是节点P的子孙 6、有序树:如果树中的每个节点的孩子节点都有特定的顺序,称为有序树。有序树:二叉树、霍夫曼树(信息编码)、B树

二叉树的非递归遍历的思想

北慕城南 提交于 2019-12-06 04:37:16
最近在学习数据结构,从书上的代码示例中学习到了一种抽象的思考方式,记录一些学习二叉树的感悟 先序遍历 先序遍历相对简单,我一开实现的时候考虑了四种情况 左孩子为空 && 右孩子为空 访问根节点,然后出栈 左孩子不为空 && 右孩子为空 访问根节点,然后继续访问左孩子 左孩子为空 && 右孩子不为空 访问根节点,入栈右孩子,出栈 左孩子不为空 && 右孩子不为空 访问根节点,入栈右孩子,继续访问左孩子 template<typename Elemtype> template<typename Fun> bool BiTree<Elemtype>::PreOrderTraverse(Fun &visit){ Stack<BiTNode<Elemtype>*> S; InitStack<bool,BiTNode<Elemtype>*>(S); BiTNode<Elemtype> *p = root; while (p != nullptr) { visit(p); if(p->rChrilde != nullptr) Push<bool,BiTNode<Elemtype>*>(S,p->rChrilde); if(p->lChrilde != nullptr) p = p->lChrilde; else //如果栈空Pop()返回false,用于判断栈空结束循环 if(!Pop<bool

二叉树的前序遍历---迭代算法

旧街凉风 提交于 2019-12-06 03:23:31
二叉树的前序遍历   二叉树的前序遍历过程相当于先访问最左边路径上的所有节点,然后在从后往前访问各个节点的右子树, 因此应该想到要使用栈结构。访问当前的节点的同时将其右子树节点放入栈中等待访问。先序遍历的代码如 下: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> s; TreeNode* temp = root; // 当栈不为空或者root不为空节点时 while(!s.empty() || temp){ //`先遍历、访问、压栈左节点` while(temp){ s.push(temp); res.push_back(temp->val); temp = temp->left; } //当访问节点不存在左子树时,退栈对右子树进行访问 temp = s.top(); s.pop(); temp = temp->right; } return res; }   使用一个辅助栈的结构进行访问,访问当前的节点并将其右子树存入栈中,直到节点的左子树不存在时从栈中将节点取出,开始 迭代访问其右子树。 来源: https://www.cnblogs.com/wangkaia/p/11960183.html

20182333 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结

别说谁变了你拦得住时间么 提交于 2019-12-05 20:15:53
20182333 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结 教材学习内容总结 图 与树类似,图由结点和这些结点之间的连接构成。 顶点(vertice):就是结点。 边(edge):就是这些结点连接起来的线段。 路径(path):图中的一系列边,每条边连通两个顶点。 路径的长度(length):是该路径中边的条数(或者是顶点数减去1)。 环路(cycle):一种首结点和末结点相同且没有重边的路径。没有环路的图称为无环的(acyclic)。 完全图(complete graph):含有最多条边的无向图 无向图 边没有方向的图称为无向图。 无向图中,表示边的顶点对是无序的,例如,标记顶点A,B,C,D,一条边可以表示为(A,B)。无向图表示顶点对是无序的,所以边(A,B)意味着A和B之间的连接是双向的,在一个无向图中,(A,B)和(B,A)所代表的边的含义完全一样。 含有最多条边的无向图称为完全图:Edges=(n-1)*n/2. 如果无向图中任意两个顶点间都有路径,则无向图称为连通的。 路径是连接图中两个顶点的边的序列,路径长度为路径所含边的数目(顶点个数减一) 第一个顶点和最后一个顶点是同一个顶点且没有重复边的路径,称为一个环。 如果图中两个顶点之间有边连接,则称这两个顶点是邻接的(邻居),自己连接到自己的边称为自循环或悬挂。 有向图