前序遍历

【树的遍历】前序中序求后序,中序后序求前序

喜你入骨 提交于 2020-03-09 07:25:22
1>求前序 #include<cstdio> #include<cstdlib> #include<iostream> using namespace std; string m,f; int len,mid[30],front[30]; int son[30][2],root; int fz(int l1,int r1,int l2,int r2) { if(l1>r1) return 0; if(l1==r1) return front[l1]; int rt=front[l1]; int pos; for(pos=l2;pos<r2;pos++) if(mid[pos]==rt) break; int ln=pos-l2; son[rt][0]=fz(l1+1,l1+ln, l2,l2+ln-1); son[rt][1]=fz(l1+ln+1,r1, l2+ln+1,r2); return rt; } void back(int rt) { if(son[rt][0]) back(son[rt][0]); if(son[rt][1]) back(son[rt][1]); printf("%c",'A'+rt-1); } int main() { cin>>m>>f; len=m.length() ; for(int i=0;i<len;i++) mid[i]=m[i]-'A'

剑指offer - 中序+先序遍历创建数组

痴心易碎 提交于 2020-03-07 09:22:14
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路: 在前序遍历里面找到第一个数,则这个数为root,然后在中序遍历的数组中找到这个数,则这个数前面的数都构成root的左子树,右边的点构成其右子树。 然后用递归 class Solution: # 返回构造的TreeNode根节点 def reConstructBinaryTree(self, pre, tin): # write code here if len(pre) == 0: return None elif len(pre) == 1: return TreeNode(pre[0]) target = pre[0] for i in range(0,len(tin)): if tin[i] == target: root = TreeNode(target) root.left = self.reConstructBinaryTree(pre[1:i+1],tin[:i]) root.right = self.reConstructBinaryTree(pre[i+1:],tin[i+1:]) return root

顺序存储二叉树的遍历

我们两清 提交于 2020-03-07 02:46:00
顺序存储二叉树一个结点下标为n,则其左结点的下标为2*n+1,右结点下标为2*n+2,一个结点的父结点下标为(n-1)/2,因此可以利用递归很容易的写出其遍历方式,这里给出前序遍历示例: //顺序存储二叉树前遍历 public class ArrBinaryTreeDemo { public static void main ( String [ ] args ) { int [ ] arr = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } ; ArrBinaryTree arrBinaryTree = new ArrBinaryTree ( arr ) ; arrBinaryTree . preOrder ( ) ; } } class ArrBinaryTree { private int [ ] arr ; public ArrBinaryTree ( int [ ] arr ) { this . arr = arr ; } // index表示数组的下标 public void preOrder ( int index ) { // 如果数组为空,或者arr.length=0 if ( arr == null || arr . length == 0 ) { System . out . println ( "数组为空,不能按照二叉树的前序遍历" ) ; }

Leetcode 144.二叉树的前序遍历

故事扮演 提交于 2020-03-05 23:10:08
1.题目描述 给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 2.解法一:递归 /** * 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 { public: vector<int> preorderTraversal(TreeNode* root) { //先判空(最简洁的写法) if(root){ res.push_back(root->val); preorderTraversal(root->left); preorderTraversal(root->right); } return res; } private: vector<int> res; }; 3.解法二:非递归(栈) 栈的作用 : 1.逆序:abc输入,cba输出; 2.路径的回溯:a-->b-->c-->d,特别是树的深度优先遍历,也是这道题的用处。(不分析太详细

LintCode-73.前序遍历和中序遍历树构造二叉树

喜夏-厌秋 提交于 2020-03-05 12:40:58
前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / 1 3 标签 二叉树 code /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { /** *@param preorder : A list of integers that preorder traversal of a tree *@param inorder : A list of integers that inorder traversal of a tree *@return : Root of a tree */ public: TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { // write your code here TreeNode

原生JS实现二叉搜索树(Binary Search Tree)

久未见 提交于 2020-03-05 09:53:30
1.简述 二叉搜索树树(Binary Search Tree) ,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 2.代码说明 首先先创建一个辅助节点类Node,它初始化了三个属性:节点值,左孩子,有孩子。 class Node { constructor(value) { this.value = value; this.left = null; this.right = null; } } 接着创建一个二叉搜索树类BST,它初始化了根节点为null。 class BST { constructor() { this.root = null; } } 然后,给这个BST类声明一些方法: insert(value):向树中插入一个节点值为value的节点。 midOrderTraverse(callback):中序遍历树,并将树中的每个节点传入callback回调函数里。 preOrderTraverse(callback):前序遍历树,并将树中的每个节点传入callback回调函数里。 lastOrderTraverse(callback):后序遍历树,并将树中的每个节点传入callback回调函数里。

二叉树(1)

倖福魔咒の 提交于 2020-03-04 14:12:19
二叉树的前序遍历 采用递归的方式可以很快得到结果,中序遍历和后序遍历与该算法几乎一样,只是有几行代码的位置换一换。 前序遍历: 先保存根节点的值,然后再去遍历左子树,然后遍历右子树。因此,添加结点值的代码在遍历左子树和右子树的结点的上面。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List < Integer > preorderTraversal ( TreeNode root ) { List < Integer > list = new ArrayList < > ( ) ; if ( root == null ) return list ; preorderFunction ( root , list ) ; return list ; } void preorderFunction ( TreeNode root , List < Integer > list ) { if ( root == null ) return ; list . add ( root .

二叉树的前序遍历、中序遍历和后序遍历

女生的网名这么多〃 提交于 2020-03-02 11:51:58
public class BinaryTreeDemo { public static void main ( String [ ] args ) { BinaryTree binaryTree = new BinaryTree ( ) ; HeroNode root = new HeroNode ( "宋江" , 1 ) ; HeroNode hero2 = new HeroNode ( "无用" , 2 ) ; HeroNode hero3 = new HeroNode ( "卢俊义" , 3 ) ; HeroNode hero4 = new HeroNode ( "林冲" , 4 ) ; //说明,我们先手动创建二叉树,后面我们学习递归的方式创建二叉树 root . setLeft ( hero2 ) ; root . setRight ( hero3 ) ; hero3 . setRight ( hero4 ) ; binaryTree . setRoot ( root ) ; //前序遍历 System . out . println ( "前序遍历" ) ; binaryTree . preOrder ( ) ; //中序遍历0 System . out . println ( "中序遍历" ) ; binaryTree . infixOrder ( ) ; /

数据结构二叉树基础以及四种遍历方式(递归和迭代)

做~自己de王妃 提交于 2020-03-02 07:27:18
数据结构二叉树基础 文章目录 数据结构二叉树基础 一、二叉树的基本概念 二、特殊的二叉树 三、二叉树的4种遍历方式 一、二叉树的基本概念 节点的度 :一个节点含有的子树的个数称为该节点的度; **树的度:**一棵树中,最大的节点的度称为树的度; 叶子节点或终端节点 :度为0的节点称为叶节点; 双亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; **根结点:**一棵树中,没有双亲结点的结点; **树的高度或深度:**树中节点的最大层次 一棵二叉树 是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉 树组成。 二叉树的特点: 每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。 二叉树的子树有左右之分,其子树的次序不能颠倒 二、特殊的二叉树 1, 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全 二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。 2, 满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果 一个二叉树的层数为K,且结点总数是(2^k)

二叉树的遍历问题

非 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 ; //用来记录字符串位置和大小