二叉树遍历

leetcode 94 二叉树的中序遍历(非递归)

荒凉一梦 提交于 2020-01-17 01:09:27
二叉树?中序遍历 题目: 给定一个二叉树,返回它的中序 遍历 例子: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 题目分析 中序遍历: 左子树 根节点 右子树 递归三行解决 非递归? 栈 保存节点信息 解题思路 变量 作用 stack<TreeNode*> s 保存节点信息 TreeNode* temp 表示当前访问节点 过程: 当s非空 取出栈顶元素作为当前节点 temp 栈顶元素出栈 如果当前节点的 右子树节点 非空 ==>入栈 (栈 先进后出 所以先将右子树节点入栈) 如果当前节点的 左子树节点 非空 ==> 1.当前节点temp重新入栈(这样遍历完左子树的时候可以再遍历回根节点) 2.当前左子树的节点入栈 3.将当前节点的 左右子树置为空 (再次遍历的时候就相当于没有左右子树 即根节点输出信息) 代码如下 class Solution { public: vector<int> inorderTraversal(TreeNode* root) { if (!root) return {}; stack<TreeNode*> s{{root}}; vector<int> ans; while(!s.empty()) { TreeNode* temp; temp = s.top(); s.pop(); if (temp->right) s

递归 VS 非递归 内涵

空扰寡人 提交于 2020-01-16 05:13:08
递归与非递归转换的基础知识是能够正确理解三种树的遍历方法:前序,中序和后序,第一篇就是关于这三种遍历方法的递归和非递归算法。 一、为什么要学习递归与非递归的转换的实现方法? 1)并不是每一门语言都支持递归的。 2)有助于理解递归的本质。 3)有助于理解栈,树等数据结构。 二、三种遍历树的递归和非递归算法 递 归与非递归的转换基于以下的原理:所有的递归程序都可以用树结构表示出来。需要说明的是,这个”原理”并没有经过严格的数学证明,只是我的一个猜 想,不过在至少在我遇到的例子中是适用的。学习过树结构的人都知道,有三种方法可以遍历树:前序,中序,后序。理解这三种遍历方式的递归和非递归的表达方 式是能够正确实现转换的关键之处,所以我们先来谈谈这个。需要说明的是,这里以特殊的二叉树来说明,不过大多数情况下二叉树已经够用,而且理解了二叉树的 遍历,其它的树遍历方式就不难了。 1)前序遍历 a)递归方式: void preorder_recursive(Bitree T) /* 先序遍历二叉树的递归算法 */ { if (T) { visit(T); /* 访问当前结点 */ preorder_recursive(T->lchild); /* 访问左子树 */ preorder_recursive(T->rchild); /* 访问右子树 */ } } b)非递归方式 void preorder

二叉树的建立与遍历(简单操作)

亡梦爱人 提交于 2020-01-14 11:18:49
Description 已知一个按先序序列输入的字符序列,如abc,de,g,f,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。 <o:p></o:p> Input 输入一个长度小于50个字符的字符串。 Output 输出共有4行: 第1行输出中序遍历序列; 第2行输出后序遍历序列; <o:p></o:p>第3行输出叶子节点个数; <o:p></o:p>第4行输出二叉树深度。<o:p></o:p> Sample Input abc,de,g,f, Output cbegdfa cgefdba 3 5 ————————————————————————————————————— 先序遍历,中序遍历,后序遍历 思想一样,只是顺序不同 二叉树高度计算 递归解法: (1)如果二叉树为空,二叉树的深度为0 (2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1 ———————————————————————————————————— # include <bits/stdc++.h> using namespace std ; struct node { char data ; struct node * lt ; //指向根的左子树 struct node * rt ; //指向根的右子树 } ; char

二叉树的后序遍历

假如想象 提交于 2020-01-14 00:55:07
如下图表示一颗二叉树,对它进行先序遍历操作,采用两种方法,递归和非递归操作。。 遍历结果为:4526731。。 1、递归操作: 思想:若二叉树为空,返回。否则 1)后序遍历右子树;2)后序遍历左子树;3)遍历根节点 代码: void PostOrder(BiTree root) { if(root==NULL) return ; PostOrder(root->lchild); //递归调用,后序遍历左子树 PostOrder(root->rchild); //递归调用,后序遍历右子树 printf("%c ", root->data); //输出数据 } 2、非递归操作 代码: void PostOrder_Nonrecursive(BiTree T) // 后序遍历的非递归 { stack<BiTree> S; BiTree curr = T ; // 指向当前要检查的节点 BiTree previsited = NULL; // 指向前一个被访问的节点 while(curr != NULL || !S.empty()) // 栈空时结束 { while(curr != NULL) // 一直向左走直到为空 { S.push(curr); curr = curr->lchild; } curr = S.top(); // 当前节点的右孩子如果为空或者已经被访问,则访问当前节点

刷题笔记:二叉树的后序遍历序列(C++)

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-12 05:02:04
剑指offer刷题笔记 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 概念补充: 二叉搜索树的概念:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 后序遍历:左子树→右子树→根节点 思路: 根据后序遍历的概念,序列的最后一个数字便是根节点的数字。 根据二叉搜索树的概念,通过与根节点的数字比较可以找到左右结点分水岭 根据二叉搜索树的左右子树仍然是二叉搜索树,可以通过递归判断左右子树是否同时为二叉搜索树 源代码: class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { return bst(sequence,0,sequence.size()-1); } private: bool bst(vector<int> seq,int begin,int end){ if(seq.empty()||begin>end){ return false; } int root=seq[end]; //根结点 int i=0; /

数据结构基础温故-4.树与二叉树(上)

孤者浪人 提交于 2020-01-09 00:33:45
前面所讨论的线性表元素之间都是一对一的关系,今天我们所看到的结构各元素之间却是一对多的关系。树在计算机中有着广泛的应用,甚至在计算机的日常使用中,也可以看到树形结构的身影,如下图所示的Windows资源管理器和应用程序的菜单都属于树形结构。树形结构是一种典型的 非线性 结构,除了用于表示相邻关系外,还可以表示层次关系。本文重点讨论树与二叉树的基本结构和遍历算法等内容。 一、好大一棵树,绿色的祝福 1.1 树的基本概念 Defination: 树(Tree)是 n(n≥0)个结点的有限集。n=0时,该树被称为“空树”。如上图所示,A点称为根节点,它有两棵子树,分别以B、C为根,而以C为根的子树又可以分成两棵子树。   1.2 树的基本术语   (1)不同的节点:根节点、内部节点、叶子节点以及节点的 度    (2)节点的关系:双亲与孩子,爸爸回来了,爸爸去哪儿?   (3)节点的层次:结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。树中结点的最大层次称为树的 深度 (Depth)或 高度 。 二、二叉树又是个什么鬼 2.1 从猜数字游戏引出二叉树   回忆一下,当年某电视节目中会让游戏参与者猜一个产品的价格,如果参与者在限定时间内猜对了,那么他就可以获得这个产品。很多人都是一点点的提高数值来猜,但是这样猜会很没有效率。因此

重建二叉树

房东的猫 提交于 2020-01-08 18:18:58
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 树中的基本结构,有遍历和递归两种方式来实现: 1、前旬遍历:先中,后左,最后右。-巧记:根左右 2、中旬遍历:先左,后中,最后右。-巧记:左根右 3、后旬遍历:先左子节点,后右子节点,最后中间根节点。-巧记:左右根 如何遍历树? —— DO GET。 题:输入二叉树的前序遍历和中序遍历结果,重建该二叉树。 待. 来源: oschina 链接: https://my.oschina.net/u/4432600/blog/3154983

树的知识点

纵然是瞬间 提交于 2020-01-08 12:09:30
树的基本概念、特点。 二叉树的定义、概念、特点。 二叉树的遍历顺序:前序DLR、中序LDR、后序LRD(递归与迭代);层序遍历(迭代) 树的操作:插入、删除、查询、遍历、旋转等 树、森林、二叉树的关系 树的应用:哈夫曼树、红黑树、AVL树、B(B+)树、Treap树、Trie树(字典树)、伸展树、替罪羊树等 来源: https://www.cnblogs.com/jest549/p/12165800.html

五、树和二叉树

坚强是说给别人听的谎言 提交于 2020-01-06 22:06:51
(待完善) 基本概念: 树 二叉树 完全二叉树 满二叉树 完美二叉树 树的遍历 (二维的树转变为一维的线性表) 遍历的应用   查找树的叶子节点   求树高度(深度)   运算表达示树   利用遍历序列确定树 二插搜索树   搜索树的查找   搜索树的插入   搜索树的删除 来源: https://www.cnblogs.com/makelin/p/12146288.html

数据结构——二叉树的遍历

不羁岁月 提交于 2020-01-06 16:07:13
二叉树的先序遍历、中序遍历和后序遍历的递归算法,二叉树的非递归算法。 1、括号表示法创建二叉树 2、实现二叉树的递归遍历算法和非递归遍历算法(非递归算法选做),依次输出二叉树的先序、中序和后序遍历序列 3、二叉树的遍历遍历二叉树,输出结点值大于C的结点,而小于等于C的结点用*替代 4、遍历二叉树,输出结点值小于D的结点,而大于等于D的结点用*替代 main.cpp # include <malloc.h> # include <stdio.h> # include <iostream> using namespace std ; typedef char ElemType ; //Visit函数,对每个节点进行的访问 //需设置函数返回值类型 typedef void Status ; Status DispLargeThanC ( ElemType e ) //该函数输出树中大于C的字符 { if ( e > 'C' ) { printf ( "%2c" , e ) ; } else { printf ( "%2c" , '*' ) ; } } Status DispLessThanD ( ElemType e ) //该函数输出树中小于D的字符 { if ( e < 'D' ) { printf ( "%2c" , e ) ; } else { printf ( "%2c" ,