中序遍历

数据结构之树

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

二叉树的遍历

醉酒当歌 提交于 2019-12-14 05:43:16
1.前序遍历 1.递归 /** * 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 { vector < int > re ; public : vector < int > preorderTraversal ( TreeNode * root ) { if ( root ) { re . push_back ( root - > val ) ; preorderTraversal ( root - > left ) ; preorderTraversal ( root - > right ) ; } return re ; } } ; 2.迭代 (1) 1.根节点入栈,出栈。 2.右子树先入栈,然后左子树入栈。 3.栈顶元素出栈 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode

线索二叉树 C++

最后都变了- 提交于 2019-12-13 13:01:59
线索二叉树 C++ 以此二叉树为例进行创建: 前序法创建节点,输入’#'表示为NULL 用前序创建的话需要输入 :ABD##E##C#G## 前序遍历:ABD##E##C#G## 中序遍历:#D#B#E#A#C#G# 后序遍历: ##D##EB###GCA 层序遍历: ABCDEG 在进行线索二叉树线索化的过程中我们并不设置 头结点, 而是**直接设置一个全局变量 指针 Prev **, 表示指向上一个节点的位置 。 思想: 1.首先对创建好的二叉树利用一次中序遍历的过程设置好 lTag 与 rtag 。 在这个过程中 T指针负责设置 T->ltag(前驱), prev指针负责设置 prev->rtag(后继) 2.中序线索二叉树的遍历 ,由于设置了前驱和后继,就可以不使用栈, 直接用 迭代法 进行中序遍历。 ThreadBiTree.h # pragma once # include <iostream> using namespace std ; # define MAX 30 typedef char ElemType ; typedef struct ThreadBiNode { ElemType data ; struct ThreadBiNode * lchild , * rchild ; int ltag , rtag ; //0表示正常连接孩子, 1表示前缀后缀

简单易懂带你了解二叉树

巧了我就是萌 提交于 2019-12-12 19:31:37
前言 上一篇博客为大家介绍了 数组与链表 这两种数据结构,虽然它们在某些方面有着自己的一些优点,但是也存在着一些自身的缺陷,本篇博客为将为大家介绍一下数据结构--- 二叉树 ,它在保留数组和链表的优点的同时也改善了它们的缺点(当然它也有着自己的缺点,同时它的实现也比较复杂). 1. 数组和链表的特点 数组的优点: 简单易用. 无序数组的插入速度很快,效率为O(1) 有序数组的查找速度较快(较无序数组),效率为O(logN) 数组的缺点: 数组的查找、删除很慢 数组一旦确定长度,无法改变 链表的优点: 可以无限扩容(只要内存够大) 在链表头的新增、删除很快,效率为O(1) 链表的缺点: 查找很慢 在非链表头的位置新增、删除很慢,效率为O(N) 2.树和二叉树 树是一种数据结构,因为它数据的保存形式很像一个树,所以得名为树(树状图). 而二叉树是一种特殊的树, 它的每个节点最多含有两个子树 ,现实世界中的二叉树: 图1 但是实际中的二叉树却是 倒挂 的,如图: 图2 二叉树的名词解释: 根:树顶端的节点称为根。一棵树只有一个根,如果要把一个节点和边的集合称为树,那么从根到其他任何一个节点都必须有且只有一条路径。A是根节点。 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;B是D的父节点。 子节点:一个节点含有的子树的根节点称为该节点的子节点;D是B的子节点。 兄弟节点

二叉树非递归遍历

血红的双手。 提交于 2019-12-11 19:30:18
上码: 1 #include <iostream> 2 #include <string> 3 #include <stack> 4 #include <queue> 5 using namespace std; 6 7 template<class T> 8 struct BiNode { 9 T data; 10 BiNode<T> *lchild, *rchild;//左子树、右子树 11 }; 12 13 template<class T> 14 class BiTree 15 { 16 public: 17 BiTree(); //构造函数,初始化二叉树,前序序列由键盘输入 18 ~BiTree(); //析构函数,释放二叉链表中的各结点的存储空间 19 BiNode<T>* Getroot(); //获得指向根节点的指针 20 void PreOrder(BiNode<T>* root); //前序遍历二叉树 21 void InOrder(BiNode<T>* root); //中序遍历二叉树 22 void PostOrder(BiNode<T>* root); //后序遍历二叉树 23 void LeverOrder(BiNode<T>* root); //层序遍历二叉树 24 25 void NonPreOrder(BiNode<T>* root); 26

二叉树遍历,查找,删除节点,线索化

霸气de小男生 提交于 2019-12-11 10:41:30
二叉树很明显就只有两个分叉,及左子节点和右子节点,这里主要是说明二叉树的遍历,查找节点和删除节点,线索化这几种。 遍历分为前序遍历,中序遍历,后序遍历这三种,前,中,后是相对中间节点来说的,及前序比那里是先中间节点,在左边节点,最后右边节点。 下面是前序遍历代码: public void preOrder(){ System.out.println(this); if(this.left!=null) { this.left.preOrder(); } if(this.right!=null) { this.right.preOrder(); } } 这是节点的前序遍历,在二叉树里面遍历还需要判断给的节点是不是空: public void preOrder() { if(this.root!=null) { this.root.preOrder(); //调用上面的preOrder方法。 }else { System.out.println("二叉树为空"); } } 中序和后序遍历和上面差不多,就是输出顺序不一样,可以自行参照对比。 查找节点:也分为前序遍历查找。中序遍历查找,后序遍历查找。 前序遍历查找思路:就是按照中间节点,左子树,右子树的顺序遍历找到相同节点就赋值,然后退出,没找到就返回一个空节点。 代码如下:也分为节点的遍历和二叉树的遍历,二叉树的遍历要判断是否为空 /

二叉树的遍历总结

人走茶凉 提交于 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-10 15:16:52
重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 遍历方式 前序遍历:根->左子树->右子树 中序遍历:左子树-> 根 -> 右子树 后序遍历:左子树 —> 右子树 —> 根结点 层次遍历:按层次遍历 重建二叉树 中序+其他任意一种遍历==唯一二叉树 解题思路 递归 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ 1.找到根结点 前序遍历 第一个节点为根节点, 后序遍历 最后一个点为根节点。 题目中根节点为1 2.确定左右子树 中序遍历中找到根节点的位置,根节点左边为左子树(4,7,2),右边的为右子树(5,3,8,6) 3.递归 左右子树分别看作一个新的树,对应新的前序和中序遍历序列(怎么确定新的遍历序列看接下来的代码),进行递归求解。 public class Solution { public TreeNode

二叉树与堆

谁说胖子不能爱 提交于 2019-12-09 22:23:01
二叉树有哪几种存储方式?哪种适合于用数组来存储? node 数组存储? 两种特殊二叉树 满二叉树:除了叶子节点之外,每个节点都有左右两个子节点 完全二叉树:叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大 节点的高度:节点到叶子节点的最长路径 节点的深度:根节点到这个节点的边的个数,从0开始 节点的层数:节点的深度加1,从1开始 树的高度:根节点的高度 树结构的存储: 1)链式存储法:节点=数据+左节点指针+右节点指针 2)数组存储法: 如果是完全二叉树:根节点存储在下标为1,那左子节点存储在下标 2 * i = 2 的位置,右子节点存储在 2 * i + 1 = 3 的位置。 如果节点 X 存储在数组中下标为 i 的位置,下标为 2 * i 的位置存储的就是左子节点,下标为 2 * i + 1 的位置存储的就是右子节点。反过来,下标为 i/2 的位置存储就是它的父节点。通过这种方式,我们只要知道根节点存储的位置(一般情况下,为了方便计算子节点,根节点会存储在下标为 1 的位置),这样就可以通过下标计算,把整棵树都串起来。 二叉树的遍历: 前序遍历 中序遍历 后序遍历 二叉查找树: 任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值 查找:类似二分查找 插入:也是先查找