后序遍历

leetcode 145 二叉树的后序遍历 C语言实现 非递归

自古美人都是妖i 提交于 2020-03-01 14:39:33
题目 代码 int * postorderTraversal ( struct TreeNode * root , int * returnSize ) { * returnSize = 0 ; if ( root == NULL ) return 0 ; # define MAX 1000000 int * arr = ( int * ) malloc ( sizeof ( int ) * MAX ) ; struct TreeNode * stack [ MAX ] , * p = root , * pre = NULL ; //pre记录节点是从左边返回还是右边 int top = - 1 ; while ( top >= 0 || p ) { if ( p ) { stack [ ++ top ] = p ; p = p -> left ; } else { p = stack [ top ] ; if ( p -> right != pre && p -> right ) p = p -> right ; else { arr [ ( * returnSize ) ++ ] = p -> val ; top -- ; pre = p ; p = NULL ; } } } return arr ; } 来源: CSDN 作者: 瓶邪写一个夏天 链接: https:/

由二叉树先序遍历序列和后序遍历序列建二叉树

我怕爱的太早我们不能终老 提交于 2020-03-01 13:55:30
思路: 1.采用递归的思想建树 2.先序遍历序列的第一个元素始终是当前子树的根; 3.在中序遍历序列中以根节点为中心,前面的是左子树的先序遍历序列,后面的右子树的先序遍历序列; #include<iostream> #include<string> using namespace std; struct Node { char data; Node* lchild; Node* rchild; }; void PreOrder(Node* root) { if(root!=NULL) { cout<<root->data; PreOrder(root->lchild); PreOrder(root->rchild); } } void BuildTree(string sPre,string sMid,Node* &root) { if(sPre.length()==0||sMid.length()==0) return; root=new Node; root->data=sPre[0]; int index=sMid.find(sPre[0]); BuildTree(sPre.substr(1,index+1),sMid.substr(0,index),root->lchild); BuildTree(sPre.substr(index+1),sMid.substr(index

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

泄露秘密 提交于 2020-03-01 13:52:57
题目: 输入一个整型数组,判断该数组是不是二叉搜索树的后序遍历结果。 如果是,返回true。否则返回false 解答: 1 public class Solution { 2 3 public static boolean VerifySquenceOfBST(int[] squence) { 4 return VerifySquenceOfBST(squence, squence.length); 5 } 6 7 private static boolean VerifySquenceOfBST(int[] squence, int length) { 8 if(squence == null || length == 0) { 9 return false; 10 } 11 12 int root = squence[length-1]; 13 14 int i = 0; 15 for(; i < length-1; i++) { 16 if(squence[i] > root) { 17 break; 18 } 19 } 20 21 int j = i; 22 for(; j < length-1; j++) { 23 if(squence[j] < root) { 24 return false; 25 } 26 } 27 28 boolean left = true;

合法二叉树后序遍历序列

隐身守侯 提交于 2020-03-01 13:52:21
转载请注明作者与出处:franciscolv http://www.cnblogs.com/franciscolv/archive/2011/11/20/2255838.html package SortSet;/** * 判断输入数组是否为合格的二叉搜索树后续遍历结果 * * @author franciscolv * */public class VerifyPosOrder { public static void main(String[] args) { int[] a = { 2, 3, 9, 11, 10, 8 }; System.out.println(verifyPosOrder(a, 0, a.length -1)); } public static boolean verifyPosOrder(int[] a, int s, int e) { if (a == null || s > e) return false; if (s == e) return true; int root = a[e]; int i = s; for (; i < e; i++) if (a[i] > root) break; for (int j = i + 1; j < e; j++) if (a[j] < root) return false; boolean left =

二叉树的非递归遍历与层次遍历

孤人 提交于 2020-03-01 13:50:44
二叉树的递归遍历很好写,也很好理解。但因为是递归程序,不可避免地需要调用系统栈,耗时较长,这里我们来探究一下二叉树的非递归遍历的算法。这种方法需要使用栈这种数据结构,这里关于栈的一些操作函数可以看成伪代码吧,先给出线序、中序、后序遍历的代码即说明。 先序遍历: 1 void PreOrderTraverse(BinTree b) 2 { 3 InitStack(S);///初始化创建栈 4 BinTree p=b;///p为工作指针 5 while(p||!isEmpty(s)) 6 { 7 while(p)///到最左下的孩子 8 { 9 printf(" %c ",p->date);///先序先遍历结点 10 Push(S,p);///入栈 11 p=p->lchild; 12 } 13 if(!isEmpty(s))///在栈不为空的情况下,左孩子为空,弹出该结点,遍历右孩子 14 { 15 p=Pop(s); 16 p=p->rchild; 17 } 18 } 19 } 再给出使用数组模拟的函数 1 void Preorder_n(BiTree bt) /*先序遍历的非递归算法*/ 2 { 3 BiTree stack[MAX],p; 4 int top=0,i; 5 for(i=0; i<MAX; i++) 6 { 7 stack[i]=NULL; /*初始化栈*/ 8

恢复二叉树

一个人想着一个人 提交于 2020-03-01 13:44:46
  二叉树的遍历方式有,前序遍历、中序遍历、后序遍历、层序遍历。   恢复二叉树的方式中,一定要有中序遍历。如:可以根据 前序+中序、后序+中序,对二叉树进行恢复。若层序遍历中,对于节点为空的节点予以标识为null,则可以只根据层序遍历恢复出二叉树。 1、前序+中序恢复二叉树: 2、后序+中序恢复二叉树: 3、带空节点标识的层序遍历恢复二叉树: 来源: https://www.cnblogs.com/guoyu1/p/12389375.html

树—最“有套路”的数据结构

ぃ、小莉子 提交于 2020-03-01 09:41:13
前言 标题用“有套路”来形容一种数据结构,似乎有点不尊重的意思。不过,我倒是觉得,一种实用的学科,就是应该产生一点套路,这才能发挥体系化研究的优势,套路就是一种保证: 在不投入更多创造性与努力的情况下,依旧能获得比起随意进行相关操作更好的结果 。一门成熟的学科都应如是,如果研究许久,在学科所研究的许多问题的实践上还不如一些“天赋”“灵感”,那就不得不说这门学科的“伪科学”或者“水分”还是蛮大的了。 言归正传,这篇文章将会是一系列寻找算法与数据结构的文章的开篇,树由于其特性,是递归、分治等等重要算法思想的典型载体,同时套路性较强又具有一定规律和难度,上手后,也可以获得总结其他算法“套路”的必要经验。作为一个训练的开头,还是很合适了。 树的定义与理解 先简要谈谈树的抽象定义:树本质上是一种无向图( 图:由顶点与路径构成的数据结构 ),其中,任意两个顶点之间 有且只有一条 路径。简而言之,树是一种具有特殊性质的图。 树的结构非常直观,而且树的大多数结构具有一个重要性质: 递归 。主要来说,就是树具有某一性质时,往往其子树也具有同样的性质。比如说,一个树如果是二叉搜索树,其子树也必须是二叉搜索树。 根据这样的性质,遇到树的问题,很自然会考虑如何合理使用递归算法,其实质就是:分解为子问题,最后解决基本情况,把复杂的递归过程交给计算机来处理。所以,树类型代码的特点就是简洁(不过换句话说

二叉树的递归,非递归遍历,深度优先遍历,广度优先遍历

馋奶兔 提交于 2020-03-01 03:57:10
/** * 二叉树的定义和遍历 */ public class BinaryTree { /** * 打印节点的信息 */ public void printNode(TreeNode<String> node){ System.out.print(node.getData()+" "); } /** * 递归先序遍历二叉树 */ public void preIterator(TreeNode<String> node){ this.printNode(node); if (node.getLefNode() != null) { this.preIterator(node.getLefNode()); } if (node.getRigNode() != null) { this.preIterator(node.getRigNode()); } } /** * 递归中序遍历二叉树 */ public void midIterator(TreeNode<String> node){ if (node.getLefNode() != null) { midIterator(node.getLefNode()); } this.printNode(node); if (node.getRigNode() != null) { midIterator(node.getRigNode(

二叉树递归和非递归遍历

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

【Golang】LeetCode-剑指Offer-面试题33-二叉搜索树的后序遍历序列【两种解法】

老子叫甜甜 提交于 2020-02-28 07:20:52
题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。 如果是则返回 true,否则返回 false。 假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3 示例 1: 输入: [1,6,3,2,5] 输出: false 示例 2: 输入: [1,3,2,6,5] 输出: true 提示: 数组长度 <= 1000 解题思路 二叉搜索树 左子树的元素是都小于根元素,右子树都大于根元素 后序遍历 首先遍历左子树,然后遍历右子树,最后访问根结点,所以数组最后一个元素是根元素。 从前面开始遍历,小于的当前根元素的值是左子树的 当找到第一个大于当前根元素的值,可以确定后半段的元素都应是在当前节点的右子树 如果后半段(右子树)里面有小于根元素的值的元素,就说明这个不是二叉搜索树的后序遍历 最后循环校验每个子树是否也满足二叉搜索树的后序遍历即可。 解法一:非递归 –执行用时:0 ms --内存消耗:2.1 MB func verifyPostorder ( postorder [ ] int ) bool { if len ( postorder ) <= 2 { return true } //在二叉搜索树中,左子树的元素是都小于根元素,右子树都大于根元素 //在后序遍历中,最后一个元素是根元素 head := len (