前序遍历

二叉树遍历(已知前序,中序,求后序遍历)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

二叉树层次遍历

我是研究僧i 提交于 2020-03-01 13:51:38
《编程之美》3.10介绍了二叉树层次遍历及从左到右输出每一层,并给出了两个扩展题目。下面是完整的代码实现: View Code 1 #include <iostream> 2 #include <cassert> 3 #include <string> 4 #include <fstream> 5 #include <vector> 6 #include <queue> 7 using namespace std; 8 9 struct Node 10 { 11 int m_data; 12 Node* m_lChild; 13 Node* m_rChild; 14 Node(int data=0,Node* lChild=NULL,Node* rChild=NULL) 15 :m_data(data),m_lChild(lChild),m_rChild(rChild){} 16 }; 17 18 //方法一通过返回值来改变和构造整棵树 19 //Node* CreateTree(Node* pNode,vector<int>::iterator &begin,vector<int>::iterator end) 20 //{ 21 // if (*begin!=-1) 22 // { 23 // pNode=new Node(*begin); 24 // if (pNode)

恢复二叉树

一个人想着一个人 提交于 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

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

死磕 java集合之TreeMap源码分析(四)-内含彩蛋

流过昼夜 提交于 2020-02-27 08:42:19
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。 二叉树的遍历 我们知道二叉查找树的遍历有前序遍历、中序遍历、后序遍历。 (1)前序遍历,先遍历我,再遍历我的左子节点,最后遍历我的右子节点; (2)中序遍历,先遍历我的左子节点,再遍历我,最后遍历我的右子节点; (3)后序遍历,先遍历我的左子节点,再遍历我的右子节点,最后遍历我; 这里的前中后都是以“我”的顺序为准的,我在前就是前序遍历,我在中就是中序遍历,我在后就是后序遍历。 下面让我们看看经典的中序遍历是怎么实现的: public class TreeMapTest { public static void main(String[] args) { // 构建一颗10个元素的树 TreeNode<Integer> node = new TreeNode<>(1, null).insert(2) .insert(6).insert(3).insert(5).insert(9) .insert(7).insert(8).insert(4).insert(10); // 中序遍历,打印结果为1到10的顺序 node.root().inOrderTraverse(); } } /** * 树节点,假设不存在重复元素 * @param <T> */ class TreeNode<T extends

二叉树四种遍历方法

ぃ、小莉子 提交于 2020-02-26 11:01:27
class Node ( object ) : def __init__ ( self , item ) : self . item = item self . lchild = None self . rchild = None class Tree ( object ) : """二叉树""" def __init__ ( self ) : self . root = None def add ( self , item ) : node = Node ( item ) if self . root is None : self . root = node return None queue = [ self . root ] while queue : cur = queue . pop ( 0 ) if cur . lchild is None : cur . lchild = node return None else : queue . append ( cur . lchild ) if cur . rchild is None : cur . rchild = node return None else : queue . append ( cur . rchild ) def breadth_travel ( self ) : """广度遍历""" queue =

【树】C003_N叉树的后序遍历(递归 | 迭代)

爱⌒轻易说出口 提交于 2020-02-25 20:07:47
一、题目描述 Given an n - ary tree , return the postorder traversal of its nodes' values . Nary - Tree input serialization is represented in their level order traversal , each group of children is separated by the null value ( See examples ) . Follow up : Recursive solution is trivial , could you do it iteratively ? Input : root = [ 1 , null , 3 , 2 , 4 , null , 5 , 6 ] Output : [ 5 , 6 , 3 , 2 , 4 , 1 ] 二、题解 方法一:递归 LinkedList < Integer > resList = null ; //先节点后跟 public List < Integer > postorder ( Node root ) { dfs ( root ) ; return resList ; } private void dfs ( Node root ) { if ( root == null )