后序遍历

线索二叉树 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 的位置),这样就可以通过下标计算,把整棵树都串起来。 二叉树的遍历: 前序遍历 中序遍历 后序遍历 二叉查找树: 任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值 查找:类似二分查找 插入:也是先查找

4-树篇

天大地大妈咪最大 提交于 2019-12-09 15:09:23
题一:【重建二叉树】输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析:根据示例可以知道,前序遍历序列第1个为根节点,再根据中序遍历序列可以得到根节点的左右子树{472},{5386};由前序遍历左子树{2 4 7}可以直到左子树根节点为2,再根据中序遍历左子树{472}可以再次分为左右子树……依次递推; 拓展: Arrays.copyOfRange(arr, i , j );复制数组,包括索引i,不包括索引j; 1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 import java.util.Arrays; 11 public class Solution { 12 public TreeNode reConstructBinaryTree(int [] pre,int [] in) { 13 if(pre

【题解】求后序遍历

给你一囗甜甜゛ 提交于 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<