中序遍历

先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

假装没事ソ 提交于 2020-03-01 13:54:02
题目: http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1291 以前的一个题,贴下代码; 1 #include<stdio.h> 2 #include<string.h> 3 char ans[100]; 4 5 void build(int n, char *s1, char *s2, char *s) 6 { 7 if(n <= 0) return; 8 int p = strchr(s2, s1[0])-s2; 9 build(p, s1+1, s2, s); 10 build(n-p-1, s1+p+1, s2+p+1, s+p); 11 s[n-1]=s1[0];//将根节点添加到最后 12 }; 13 14 int main() 15 { 16 int k,t; 17 char s1[100], s2[100]; 18 gets(s1); 19 gets(s2); 20 k=strlen(s1); 21 build(k, s1, s2,ans); 22 printf("%s\n",ans); 23 return 0; 24 } 来源: https://www.cnblogs.com/bfshm/p/3166010.html

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

孤人 提交于 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

54.二叉树搜索树的第k大节点

不羁的心 提交于 2020-02-29 20:08:01
以前一直用的都是中序遍历的正常模式,就是左根右,这一次居然是左右根,从来没想到这么用过,这道题提醒我了。 就是设置一个全局count,当count为1时,说明当前节点就是目标节点,返回值就行,这里要注意的是返回值的时候count依然要减1,不然的话对于递归的上一层来说count还是等于1就依然会更新res的值,代码如下: 来源: CSDN 作者: qq_40058686 链接: https://blog.csdn.net/qq_40058686/article/details/104574342

二叉树的中序遍历(94)

孤人 提交于 2020-02-28 01:56:35
题目描述:给定一个二叉树,返回它的中序 遍历。 示例:   输入: [1,null,2,3]      1      \      2      /      3 输出: [1,3,2] 解法一:递归(较简单)     /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { List<Integer> lis = new ArrayList<>(); public List<Integer> inorderTraversal(TreeNode root) { if (root == null) return lis;  //若节点为空,则返回当前结果数组 inorderTraversal(root.left);    //对左子树进行中序遍历 lis.add(root.val);           inorderTraversal(root.right);   //对右子树进行中序遍历 return lis; } } 解法二:(迭代)--基于栈的中序遍历 class Solution { public

从中序与后序遍历序列构造二叉树

大城市里の小女人 提交于 2020-02-27 14:56:04
根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 code:先中序中找到根后,可以根据根在中序中的位置划分左右子树的长度,根据中序中划分的左右子树的长度,在后序中划分左右子树,后序序列中:左、右、根。 /** * 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 { private: TreeNode* buildTreeCore(vector<int>& in,int inStart,int inEnd, vector<int>& post,int postStart,int postEnd) { if(inStart>inEnd||postStart>postEnd) return nullptr; TreeNode* root=new

死磕 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