二叉树遍历

二叉树的遍历问题

非 Y 不嫁゛ 提交于 2020-03-02 01:02:36
二叉树的定义是用递归定义的,这样我们会发现在它在前中后遍历、甚至插入、建立程序中常常用到递归,实际上把握好了递归,也就把握好了二叉树的遍历问题。 下面是一些问题练习 1.从一个遍历(明确空树)中确定树 时间限制: 1 Sec 内存限制: 32 MB 提交: 312 解决: 186 [提交][状态][讨论版][命题人:外部导入] 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。 输入 输入包括1行字符串,长度不超过100。 输出 可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。 样例输入 a#b#cdef##### a## 样例输出 a b f e d c a 分析: 这个问题其实简单,题目是给出了前序遍历的输入,如果我们也跟着前序遍历,过程中再建立树,题目就可解了,不过得注意边界条件发生了变化。 # include <iostream> # include <string> using namespace std ; string s ; int i , n ; //用来记录字符串位置和大小

二叉树遍历(已知前序,中序,求后序遍历)java

我与影子孤独终老i 提交于 2020-03-01 22:35:07
题目描述 二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。 输入 两个字符串,其长度n均小于等于26。 第一行为前序遍历,第二行为中序遍历。 二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。 输出 输入样例可能有多组,对于每组测试样例, 输出一行,为后序遍历的字符串。 样例输入 ABC CBA ABCDEFG DCBAEFG 样例输出 CBA DCBGFEA import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()) { String pre = in.next(); String mid = in.next(); String ans = postOrder(pre,mid); System.out.println(ans); } in

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

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

【剑指Offer】4.重建二叉树(Python实现)

落花浮王杯 提交于 2020-03-01 05:59:04
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 解法一:递归法 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def reConstructBinaryTree(self, pre, tin): # 边界条件 if not pre or not tin: return None # 前序根节点和中序索引 root = TreeNode(pre.pop(0)) index = tin.index(root.val) root.left = self.reConstructBinaryTree(pre, tin[:index]) root.right = self.reConstructBinaryTree(pre, tin[index + 1:]) return root 来源: CSDN 作者: 数挖小飞飞 链接: https://blog.csdn.net/qq

二叉树递归和非递归遍历

☆樱花仙子☆ 提交于 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 (

Leetcode 589.N叉树的前序遍历(N-ary Tree Preorder Traversal)

夙愿已清 提交于 2020-02-27 15:17:59
Leetcode 589.N叉树的前序遍历 1 题目描述( Leetcode题目链接 )   给定一个 N 叉树,返回其节点值的前序遍历。例如,给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4]。 说明: 递归法很简单,你可以使用迭代法完成此题吗? 2 题解   用栈的数据结构,方法同 二叉树的前序遍历 。 """ # Definition for a Node. class Node: def __init__(self, val=None, children=None): self.val = val self.children = children """ class Solution : def preorder ( self , root : 'Node' ) - > List [ int ] : if not root : return [ ] retv = [ ] stack = [ root ] while stack : root = stack . pop ( ) retv . append ( root . val ) stack . extend ( root . children [ : : - 1 ] ) return retv 来源: CSDN 作者: 就叫昵称吧 链接: https://blog.csdn.net/qq