后序遍历

数据结构二叉树

僤鯓⒐⒋嵵緔 提交于 2019-11-28 01:39:25
1.二叉树的根节点,子节点,双亲,祖宗,孩子,层次编号,深度,有关兄弟关系? 度为2的树不是二叉树。 二叉树的定义与特征;二叉树的顺序存储和链式存储;二叉树的遍历;线索二叉树的基本概念和构造。 2.倾斜二叉树与完全二叉树 3.前中后序遍历 前根序遍历:先遍历根结点,然后遍历左子树,最后遍历右子树 中根序遍历:先遍历左子树,然后遍历根结点,最后遍历右子树 后根序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点 4.中序线索二叉链表有子节点就用 f 无子节点就用 t 5.树和森林 双亲表示法 孩子表示法 长子-兄弟表示法 6.树和森林的遍历 先根遍历 后根遍历 7.BST树 AVL树 8.平衡二叉树 平衡状态:左右两侧度数相同 左倾:左边度数大于右边 右倾:右边度数大于左边 来源: https://www.cnblogs.com/gmkk/p/11386169.html

二叉树的遍历

被刻印的时光 ゝ 提交于 2019-11-28 01:35:34
import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;import java.util.Stack;/** * Created by zhouguojing on 2019/8/20. */public class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; }//先序遍历 public static ArrayList<Integer> preOrder(TreeNode root) { ArrayList<Integer> list = new ArrayList<Integer>(); if(root == null) return null; list.add(root.val); if(root.left!=null) list.addAll(preOrder(root.left)); if(root.right!=null) list.addAll(preOrder(root.right)); return list; } //中序遍历 public static ArrayList<Integer> inOrder

二叉树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 15:59:52
最近写了一下关于二叉树的三种遍历算法的递归以及非递归实现,以及层次遍历算法实现 先序遍历递归实现 /** * 先序遍历,根》左》右 */ public void beforeTraverse ( TreeNode root ) { if ( root == null ) { return ; } System . out . print ( root . val + "->" ) ; if ( root . left != null ) { beforeTraverse ( root . left ) ; } if ( root . right != null ) { beforeTraverse ( root . right ) ; } } 先序遍历非递归实现 /** * 通过栈遍历二叉树,先序(思想就是:入栈即记录) */ public List < String > beforeTraverseByStack ( TreeNode root ) { List < String > list = new ArrayList < > ( ) ; // 接受结果 if ( root == null ) { return list ; } Stack < TreeNode > stack = new Stack < > ( ) ; // 先序遍历(根 》左 》右),先遍历所有左结点

剑指 二叉搜索树的后序遍历

折月煮酒 提交于 2019-11-27 12:35:08
题目链接 后序,左右根。 设l为左端,r为右端,vector为a。 a[r]一定是根。 比a[r]大的都是右儿子,比a[r]小的都是左儿子。 那么找到一个i为分界线递归判断即可。 class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size() == 0) return false; return dfs(sequence, 0, sequence.size() - 1); } bool dfs(vector<int> a, int l, int r) { if(l >= r) return true; int i; for(i = r - 1; a[i] >= a[r] && i >= l; i--); for(int j = i; j >= l; j--) if(a[j] > a[r]) return false; return dfs(a, l, i) && dfs(a, i + 1, r - 1); } }; 来源: https://blog.csdn.net/qq_36553623/article/details/99675588

二叉树的遍历

妖精的绣舞 提交于 2019-11-27 07:46:46
二叉树的遍历是指通过一定的顺序访问二叉树的所有结点。遍历方法一般有四种:先序遍历、中序遍历、后序遍历和层次遍历,其中,前三种一般使用深度优先搜索(DFS)实现,而层次遍历一般使用广度优先搜索(BFS)实现 把一颗二叉树分为三个部分:根节点、左子树、右子树,且对左子树和右子树可以同样进行这样的划分,这样对树的遍历就可以分为对这三个部分的遍历,这三种方法中,左子树一定要先于右子树遍历,且所谓的“先中后”都是指根节点root在遍历中的位置,因此先序遍历的访问顺序是根节点-左子树-右子树;中序遍历的访问顺序是左子树-根节点-右子树;后序遍历的访问顺序是左子树-右子树-根节点。 先序遍历 1、先序遍历的实现 对先序遍历来说,总是先访问根节点root,再访问左子树和右子树,因此先序遍历的顺序是根节点-左子树-右子树 为了实现递归的先序遍历,需要得到两样东西:递归式和递归边界。其中递归式已经可以由先序遍历直接得到,即先访问根节点(可以做任何事情),再递归访问左子树,最后递归访问右子树,递归边界就是子树为空 先序遍历的代码如下: void preorder(node *root){ if(root==NULL){ //到达空树,递归边界 return; } //访问根节点root,例如将其数据域输出 printf("%d\n",root->data); //访问左子树 preorder(root-

二叉树 ADT接口 遍历算法 常规运算

徘徊边缘 提交于 2019-11-27 03:32:47
BTree.h (结构定义, 基本操作, 遍历) #define MS 10 typedef struct BTreeNode{ char data; struct BTreeNode * left struct BTreeNode * right; }BTreeNode; BTreeNode* InitBTree(); /*初始化二叉树,即把树根指针置空*/ BTreeNode* CreateBtree(char *a); /*根据a所指向的二叉树广义表字符串建立对应的存储结构,返回树根指针*/ int BTreeEmpty(BTreeNode* BT); /*判断一颗二叉树是否为空,若是则返回1,否则返回0*/ void Preorder(BTreeNode * BT); /*先序遍历的递归算法*/ void Inorder(BTreeNode * BT); /*中序遍历的地鬼算法*/ void Postorder(BTreeNode * BT); /*后序遍历的递归算法*/ void Levelorder(BTreeNode* BT); /*按层遍历由BT指针所指向的二叉树*/ void Inorder(BTreeNode* BT); /*对二叉树进行中序遍历的非递归算法*/ int BTreeDepth(BTreeNode * BT); /*求BT指向的一颗二叉树深度*/

二叉树的三种遍历方式

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

二叉搜索树的后序遍历序列

一个人想着一个人 提交于 2019-11-27 02:20:51
【问题】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 【思路】注意题目给出的是二叉搜索树,那么它就有一个很重要的性质: 左孩子值<=根的值<=右孩子的值! 但题目中说明了任意两个数字都互不相同,说明没有重复数字。 由于给出的是后序遍历,我们就可以知道最后一个数为根节点,并且其左子树的值均小于根节点的值,右子树的值均大于根节点的值。因此我们可以从头遍历,直到找到第一个大于根节点的值,我们就可以得到左右子树划分的边界,其后面所有值都应该大于根节点的值,最后利用分治思想进行递归即可! class Solution { public: bool process(vector<int> seq, int start, int end){ if(seq.size() == 0) return false; int i; // 左子树的索引 if (start >= end){ return true; } for(i = 0;i < end; i++){ if(seq[i] > seq[end]){ break; } } for(int j = i;j < end; j++){ // j 为右子树的索引 if(seq[j] < seq[end]){ return false; } } return