前序遍历

程序员,你心里就没点树吗?

雨燕双飞 提交于 2019-11-28 06:26:32
看官,不要生气,我没有骂你也没有鄙视你的意思,今天就是想单纯的给大伙分享一下树的相关知识,但是我还是想说作为一名程序员,自己心里有没有点树?你会没点数吗?言归正传,树是我们常用的数据结构之一,树的种类很多有二叉树、二叉查找树、平衡二叉树、红黑树、B树、B+树等等,我们今天就来聊聊二叉树相关的树。 什么是树? 首先我们要知道什么是树?我们平常中的树是往上长有分支的而却不会形成闭环,数据结构中的树跟我们我们平时看到的树类似,确切的说是跟树根长得类似,我画了一幅图,让大家更好的理解树。 图1、图2都是树,图3不是树。每个红色的圆圈我们称之为元素也叫节点,用线将两个节点连接起来,这两个节点就形成了父子关系,同一个父节点的子节点成为兄弟节点,这跟我们家族关系一样,同一个父亲的叫做兄弟姐妹,在家族里面最大的称为老子,树里面也是一样的,只是不叫老子,叫做跟节点,没有子节点的叫做叶子节点。我们拿图1来做示例,A为根节点,B、C为兄弟节点,E、F为叶子节点。 一颗树还会涉及到三个概念 高度 、 深度 、 层 ,我们先来看看这三个名词的定义: 高度 :节点到叶子节点的最长路径,从0开始计数 深度 :跟节点到这个节点所经历的边数,从0开始计数 层 :节点距离根节点的距离,从1开始计数 知道了三个名词的概念之后,我们用一张图来更加形象的表示这三个概念。 以上就是树的基本概念,树的种类很多

二叉树基础知识

非 Y 不嫁゛ 提交于 2019-11-28 05:55:32
二叉树基础知识 1. 树定义 树(Tree) 是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中: 1)有且仅有一个特定的称为根(Root)的结点; 2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。 ​ 3)每一棵树有且只有一个根节点,子节点没有限制,但是每个节点都互不相交。 上图就是一个普通的数。 2. 树相关概念 ​ 2.1节点的度 ​ 节点的度就是节点拥有的子树的数目。上图A的节点的度为2。 ​ 2.2树的深度 ​ 树的深度就是树中节点的最大层次树。上图树的深度为4。 ​ 2.3节点关系 ​ 树只有一个根节点,其余的为树的孩子节点。分布在根节点的左边的节点称为左孩子,右边为右孩子,左右孩子在同一层次上称为兄弟节点。而根节点即为孩子节点的双亲节点。 3. 二叉树 ​ 二叉树定义 :二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。 以上即为一颗普通的二叉树。 二叉树特点 :1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。 2)左子树和右子树是有顺序的,次序不能任意颠倒。 3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。 二叉树性质 : 1

二叉树——前序遍历、中序遍历、后序遍历、层序遍历详解(递归非递归)

Deadly 提交于 2019-11-28 05:15:45
前言 前面介绍了 二叉排序树的构造和基本方法 的实现。但是排序遍历也是比较重要的一环。所以笔者将 前中后序 .和层序遍历梳理一遍。 了解树的遍历,需要具有的只是储备有 队列,递归,和栈 。这里笔者都有进行过详细介绍,可以关注笔者 数据结构与算法专栏 。持续分享,共同学习。 层序遍历 层序遍历。听名字也知道是按层遍历。我们知道一个节点 有左右节点 。而每一层一层的遍历都和左右节点有着很大的关系。也就是我们选用的数据结构不能一股脑的往一个方向钻,而 左右应该均衡考虑 。这样我们就选用队列来实现。 对于队列,现进先出。从根节点的节点push到队列,那么队列中先出来的顺序是第二层的左右(假设有)。 第二层 每个执行的时候添 加到队列 ,那么添加的所有节点都在 第二层后面 。 同理,假设开始 pop遍历第n层 的节点,每个节点会 push左右两个节点进去 。但是队列先进先出。它会放到队尾( 下一层 )。直到第n层的 最后一个pop出来 ,第n+1层的还在队列中整齐排着。这就达到一个 层序 的效果。 实现的代码也很容易理解: public void cengxu(node t) {//层序遍历 Queue<node> q1 = new ArrayDeque<node>(); if (t == null) return; if (t != null) { q1.add(t); } while (

二叉树的遍历

大兔子大兔子 提交于 2019-11-28 02:13:05
二叉树的遍历 #include " iostream " #include " stdlib.h " using namespace std; struct tree { int data; struct tree * left; struct tree * right; }; typedef struct tree treenode; typedef treenode * btree; /* ------插入二叉树的结点------- */ btree insertnode(btree root, int value) { btree newnode; btree current; btree back; /* ---创建新结点内存--- */ newnode = (btree)malloc( sizeof (treenode)); newnode -> data = value; newnode -> right = NULL; newnode -> left = NULL; if (root == NULL) { return newnode; } else { current = root; while (current != NULL) { back = current; if (current -> data > value) current = current ->

二叉树java遍历实现

狂风中的少年 提交于 2019-11-28 01:11:46
假设二叉树如图: import java.util.ArrayList; import java.util.List; import org.junit.Test; public class MyTree { private Node root = null; public MyTree() { init(); } private List<Node> list = new ArrayList<Node>(); private void init() { Node e = new Node("E", null, null); Node d = new Node("D", null, null); Node b = new Node("B", d, e); Node c = new Node("C", null, null); Node a = new Node("A", b, c); root = a; } private class Node { private String data; private Node lChild; private Node rChild; public Node(String data, Node lChild, Node rChild) { this.data = data; this.lChild = lChild; this.rChild =

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

那年仲夏 提交于 2019-11-27 16:58:10
目录 教材学习内容总结 教材第15章 教材第16章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周错题总结 点评过的同学博客和代码 学习进度条 正文 20182311 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结 教材学习内容总结 教材第15章 树的概述 定义:树是一种非线性结果,元素按分层组织。它含有结点和连接结点的边,位于树最高层的是根节点root,结点相对于根节点的位置表示结点的层。树中不含有子节点的结点为叶结点,除叶结点和根结点外的其他结点都是内节点。 树的阶:结点含有的最大子结点数。 路径长度:连接两个结点边的数量。高度:从根结点到叶结点的最长路径的长度。 n元树:任一结点的子节点数目不多于n的 平衡:所有叶结点都位于同一层 完全:树平衡,且最底层的叶结点都在树的左边 树的实现: 数组实现策略:使用数组实现树,数组下标为n的结点的左子树下标为2n,右子树下标为2n+1。思路简单,访问迅速,但是该数组会为不含数据的树位置分配空间,浪费存储空间。 模拟连接策略:在数组中存入孩子的数组索引,为了节省空间会增加删除树中元素时,数组元素进行移位的成本。 链表实现:链表是最常见的造树方法,二叉链表可连接左右节点,三叉链表可指向父节点,多叉链表可以指向更上一级或者siblings 树的遍历:递归遍历比非递归遍历更简单

二叉树的三种遍历方式

≡放荡痞女 提交于 2019-11-27 02:27:44
二叉树的遍历是图论中学到知识,分别有三种遍历方式:前序中序后序,假设根节点是a,左节点是b,右节点是c,那么前序遍历是abc,中序遍历是bac,后序遍历是bca;这样看的话就比较好理解这三种遍历了。 来源: https://www.cnblogs.com/wyx66688/p/11338208.html

【转】二叉树的非递归遍历

和自甴很熟 提交于 2019-11-27 01:23:49
原文: http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现 void preOrder1(BinTree * root) // 递归前序遍历 { if (root != NULL) { cout << root -> data << " " ; preOrder1(root -> lchild); preOrder1(root -> rchild); } } 2.非递归实现 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈

二叉树非递归遍历

淺唱寂寞╮ 提交于 2019-11-27 01:23:05
1、二叉树递归遍历很简单,以前序遍历为例说明: 1 void PrefixOrder(Node* node) 2 { 3 if (node!= NULL) 4 { 5 cout<<root->value<< " " ; 6 PrefixOrder(root-> lchild); 7 PrefixOrder(root-> rchild); 8 } 9 }   中序遍历和后序遍历类似。 2、考虑二叉树非递归遍历,思路:前序遍历特点,访问当前节点,然后访问左孩子,左孩子有孩子,继续访问左孩子的左孩子节点,直到没有左孩子,访问右孩子。因此。非递归遍历的思路就是,使用while,记录当前节点,往左一条路走到底,然后原路后退,访问右节点。 转载于:https://www.cnblogs.com/nzbbody/p/3450144.html 来源: https://blog.csdn.net/weixin_30231093/article/details/99234535

图的遍历

雨燕双飞 提交于 2019-11-27 00:24:02
没有用的话qaq : Ummmm…图论的大部分知识本来早就有学过,只是一直没有写成博文来梳理,但既然上了qbxt DP图论就写一篇来总结下, 主要是来听DP的,但…由于太菜的原因,DP听得天花乱坠QWQ 图的遍历分为两种,图的深度优先遍历和图的广度优先遍历,深度优先遍历是用栈来实现的,可以用手写栈,也可以递归(要小心没开栈的时候爆栈) 一,图的深度优先遍历 实现很简单,和dfs一样,分为以下几个步骤 1,从起点s开始遍历 2,当遍历到节点u时,如果u节点没有被访问过,那么就访问u在访问u没有被访问过的相邻节点,一直到头.... 3,当所有节点都被访问之后,遍历结束。 inline void dfs(int s) { vis[s]=true; for(int i=first[s];i;i=edge[i].nxt) { if(!vis[edge[i].ed]) dfs(edge[i].ed); } } 二叉树的三种dfs序:先序遍历,中序遍历,后序遍历 1,前序遍历:先访问根节点,然后依次访问每一棵子树,如上述过程一样。 比如上图的先序遍历为B,F,E,K,L 2,中序遍历:先访问左子树,再访问根节点,再访问右子树。 比如上图的中序遍历为F,B,K,E,L 3,后序遍历:先访问左子树,再访问右子树,最后访问根节点 比如上图的后序遍历为F,K,L,E,B * 二,图的广度优先遍历