中序遍历

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

白昼怎懂夜的黑 提交于 2019-12-05 15:33:13
20182301 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结 教材学习内容总结 图的结构构成 顶点(vertex):图中的数据元素,如图一 边(edge):图中连接这些顶点的线,如图一 G=(V,E) 或者 G=(V(G),E(G)) 其中 V(G)表示图结构所有顶点的集合,顶点可以用不同的数字或者字母来表示。E(G)是图结构中所有边的集合,每条边由所连接的两个顶点来表示。 图结构中顶点集合V(G)不能为空,必须包含一个顶点,而图结构边集合可以为空,表示没有边。 图的基本概念 无向图 如果一个图结构中,所有的边都没有方向性,那么这种图便称为无向图。典型的无向图,如图二所示。由于无向图中的边没有方向性,这样我们在表示边的时候对两个顶点的顺序没有要求。例如顶点VI和顶点V5之间的边,可以表示为(V2, V6),也可以表示为(V6,V2)。 有向图 一个图结构中,边是有方向性的,那么这种图就称为有向图,如图三所示。由于图的边有方向性,我们在表示边的时候对两个顶点的顺序就有要求。我们采用尖括号表示有向边,例如<V2,V6>表示从顶点V2到顶点V6,而<V6,V2>表示顶点V6到顶点V2。 顶点的度 连接顶点的边的数量称为该顶点的度。顶点的度在有向图和无向图中具有不同的表示。对于无向图,一个顶点V的度比较简单,其是连接该顶点的边的数量,记为D(V)。

C++二叉树值创建于遍历二

一个人想着一个人 提交于 2019-12-05 14:33:39
#include <iostream> #include <cstdlib> #include<queue> #include <stack> using namespace std; //二叉树链表的存储结构 typedef struct BiTNode { int data;//节点数据 struct BiTNode *lchild, *rchild;//左右孩子指针 }BiTNode, *BiTree; //二叉树的建立 void CreatBiTree(BiTree &T) { int ch; cin >> ch; if (ch == 0) T = NULL; else { T = new BiTNode;//生成根节点 if (!T) exit(1); T->data = ch; CreatBiTree(T->lchild); //构造左子树 CreatBiTree(T->rchild); //构造右子树 } } //创建二叉树 BiTNode* create(int b[], int n) { BiTNode* ptree =new BiTNode [n]; int i; for (i = 0; i < n; i++) { ptree[i].data = b[i];//给每个节点赋值 ptree[i].lchild = NULL;// ptree[i].rchild =

《数据结构与面向对象程序设计》第10周学习总结

痞子三分冷 提交于 2019-12-05 11:27:18
学号20182329 2019-2020-1 《数据结构与面向对象程序设计》第10周学习总结 教材学习内容总结 实现二叉排序树,并学会编写删除、添加、插入,还有二叉排序树的遍历 学习图的有关知识,了解有向图和无向图的区别, 学习带权图,学会计算带权图的算法,最佳的算法。 学习图的各种遍历,比如深度优先遍历和广度优先遍历。 学习生成最小树的方法 学会生成图的邻接矩阵的方法,还有计算每个节点的出度入度方法实现 学会每个图的计算度的方法,还有不通过遍历进行的。 教材学习中的问题和解决过程啊 问题1:在学习计算带权图的各个路径上的带权值值之和时,发现自己用中序遍历的方法将带权图的总值计算出来,但是在计算各个节点上的带全值时,有些节点总是少一个全职。 问题1解决方法:后来认识到图不一定是完全二叉树,所以在进行这个遍历时会少掉一些全职或者说是子叶,然后我用学习了深度优先遍历的代码,虽然算法比较慢,但是可以不遗漏,一下是深度优先遍历的代码: public void dFS_AM(int site) {               //输入深度优先遍历的开始顶点 System.out.println(this.vexs[site]);         //输出该顶点 this.visited[site] = true;               //置访问标志为true for(int i =

二叉树的中序遍历

ぐ巨炮叔叔 提交于 2019-12-05 11:16:54
题目:给定一个二叉树,返回它的 中序 遍历。 来源:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 法一:网上的代码 思路:利用栈的递归,对每次取的节点进行标记,第一次遍历该节点时,标记为灰色,左子树和右子树标记为白色,注意入栈的顺序是右 中 左,因为最后存储的顺序的左 中 右. # Definition for a binary tree node. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def inorderTraversal(self, root: TreeNode): print('root is:') print(root) WHITE, GRAY = 0, 1 res = [] stack = [(WHITE, root)] while stack: color, node = stack.pop() # 如果节点为空则结束本次循环,继续从栈从取元素 if node is None: continue if color == WHITE: # 注意这里为了实现中序遍历,入栈的顺序是右 中 左 stack.append(

leetcode105 从前序与中序遍历序列构造二叉树

旧街凉风 提交于 2019-12-05 09:52:58
如何遍历一棵树 有两种通用的遍历树的策略: 宽度优先搜索(BFS) 我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。 深度优先搜索(DFS) 在这个策略中,我们采用深度作为优先级,以便从跟开始一直到达某个确定的叶子,然后再返回根到达另一个分支。 深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为前序遍历,中序遍历和后序遍历。 public class Solution{ private int preIndex=0; private int[] preOrder; private int[] inOrder; Map<Integer,Integer> map=new HashMap<Integer,Integer>(); publice TreeNode bulidTree(in[] preOrder,int[] inOrder){ this.preOrder=preOrder; this.inOrder=inOrder; int idx=0; for(Integer s:inOrder){ map.put(s,idx++); } } private TreeNode helper(Int left,int right){ if(left==right){ return null; } int index=0; int root

PTA 树的遍历

喜欢而已 提交于 2019-12-05 08:52:45
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 用数组模拟二叉树,设根结点为n,左孩子编号为2n,右孩子编号为2n+1,以这种方式存储二叉树 按顺序输出则为层序遍历。下面就定义一个数组,然后不断在子递归中查找根结点,将根结点存入相应的数组位置中。 1 //下标从0开始 2 //post[]为已知的后序遍历元素,in[]为已知的中序遍历元素 3 //len-1为传进的post[]的根结点下标,len为在子递归函数(即左右子树)中的元素个数 4 //p为根在num[]中的存储位置,即左右孩子结点成为子递归的根 5 //p的起始位置是1 6 void Levelorder(int post[],int in[],int len,int p) 7 { 8 if(len < 1) //当子树没有元素时,返回 9 { 10 num[p] = -1; 11 return; 12 } 13 14 int i

二叉树的遍历

妖精的绣舞 提交于 2019-12-05 07:17:18
二叉树的遍历 二叉树的前序,中序,后序,层序遍历 package 剑指offer;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;/** * @author WangXiaoeZhe * @Date: Created in 2019/11/22 18:11 * @description: */public class Main17 { public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } ArrayList<Integer> resultList = new ArrayList<>(); /** * 前序遍历:ABDEC * 1.首先遍历左子树,遍历到叶子结点为止 * @return * */ public boolean preorderTraverse(TreeNode node) { //首先从根节点开始遍历 resultList.add(node.val); if (node.left != null) { preorderTraverse(node.left); }

树的前世今生之数据结构遍历二叉搜索树平衡二叉树哈夫曼树哈夫曼编码堆的路径集合的并查按秩归并与路径压缩

百般思念 提交于 2019-12-05 02:11:11
正在更新~~~~ 在介绍树的概念之前,先来看一下树的四种遍历方式以此更直观了解树 void InorderTraversal( BinTree BT ) { if( BT ) { InorderTraversal( BT->Left ); /* 此处假设对BT结点的访问就是打印数据 */ printf("%d ", BT->Data); /* 假设数据为整型 */ InorderTraversal( BT->Right ); } }//中序遍历 void PreorderTraversal( BinTree BT ) { if( BT ) { printf("%d ", BT->Data ); PreorderTraversal( BT->Left ); PreorderTraversal( BT->Right ); } }//先序遍历 void PostorderTraversal( BinTree BT ) { if( BT ) { PostorderTraversal( BT->Left ); PostorderTraversal( BT->Right ); printf("%d ", BT->Data); } }//后序遍历 void LevelorderTraversal ( BinTree BT ) { Queue Q; BinTree T; if ( !BT )

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

大城市里の小女人 提交于 2019-12-05 00:31:50
20182333 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结 教材学习内容总结 第十六章 树 树 1.树是非线性结构,其元素组织为一个层次结构 2.树的度表示树中的任意结点的最大子结点数 3.有m个元素的平衡n叉树的高度是lognm 4.树的遍历有4种方法 5.进行层序遍历时可采用队列来储存树中的元素 6.使用数组实现二叉树时,位于位置n的元素的左孩子在(2n+1)的位置,其右孩子在(2*(n+1))的位置 7.树的基于数组的存储链实现方式可以占数组中的连续位置,不管树是不是完全树 8.如何在一般二叉树中添加及删除元素,要取决于树的用途 9.使用决策树可以设计专家系统 二叉树 1.二叉查找树时一颗二叉树,对于其中的每个结点,左子树上的元素小于父结点的值,二右子树上的元素大于等于父结点的值 2.如果没有其他的操作,二叉查找树的树形由元素的添加次序来决定 3.最有效地二叉查找树时平衡的,所以每次比较时可以排除一半的元素 4.当从二叉查找树中删除元素时要考虑三种情形,其中的两种比较简单 5.当从二叉查找树中删除有两个子结点的结点时,比较好的办法是用它的中序后继来取代它 6.可以对二叉查找树进行旋转以恢复平衡 部分计算公式 1.二叉树上第i层上的结点数目最多为2^(i-1)(i>=1) 2.深度为k的二叉树至多有2^k-1个结点(i>=1) 3

数据结构与算法之美学习笔记:第二十三讲

大憨熊 提交于 2019-12-05 00:21:43
一、课前思考 前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构牛逼线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。 我反复强调过,带着问题学习,是最有效的学习方式之一,所以在正式的内容开始之前,我还是给你出几道思考题: 二叉树有哪几种存储方式?什么样的二叉树适合用数组来存储? 带着这些问题,我们就来学习今天的内容,树! 二、树 1、一些节本概念 图中画了几棵“树”。你来看看,这些“树”都有什么特征? 你有没有发现,“树”这种数据结构真的很像我们现实生活中的“树”,这里面每个元素我们叫作“节点”;用来连线相邻节点之间的关系,我们叫作“父子关系”。 比如下面这幅图: A节点就是B节点的 父节点 ,B节点是A节点的 子节点 。 B、C、D这三个节点的父节点是同一个节点,所以它们之间互称为 兄弟节点 。 我们把没有父节点的节点叫作 根节点 ,也就是图中的节点E。 我们把没有子节点的节点叫作叶子节点或者 叶节点 ,比如图中的G、H、I、J、K、L都是叶子节点。 2、高度深度和层 除此之外,关于“树”,还有三个比较相似的概念:高度(Height)、深度(Depth)、层(Level)。它们的定义是这样的: 这三个概念的定义比较容易混淆,描述起来也比较空洞。我举个例子说明一下,你一看应该就能明白。 记这住个概念,我还有一个小窍们,就是类比