中序遍历

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

北城以北 提交于 2019-12-01 03:19:13
public class Solution { int i=0; public TreeNode reConstructBinaryTree(int [] pre,int [] in) { return constructBiTree(pre,in,0,pre.length-1); } public TreeNode constructBiTree(int pre[],int in[],int start,int end){ if(start>end) return null; TreeNode node = new TreeNode(pre[i]); int index=Location(pre[i],in); i++; if(i>=pre.length) return node; node.left=constructBiTree(pre,in,start,index-1); node.right=constructBiTree(pre,in,index+1,end); return node; } public int Location(int target,int in[]){ int i=0; for( i=0;i<in.length;i++){ if(target==in[i]) break; } return i; } } 来源: oschina 链接: https:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

落花浮王杯 提交于 2019-12-01 03:16:14
public class Solution { int i=0; public TreeNode reConstructBinaryTree(int [] pre,int [] in) { return constructBiTree(pre,in,0,pre.length-1); } public TreeNode constructBiTree(int pre[],int in[],int start,int end){ if(start>end) return null; TreeNode node = new TreeNode(pre[i]); int index=Location(pre[i],in); i++; if(i>=pre.length) return node; node.left=constructBiTree(pre,in,start,index-1); node.right=constructBiTree(pre,in,index+1,end); return node; } public int Location(int target,int in[]){ int i=0; for( i=0;i<in.length;i++){ if(target==in[i]) break; } return i; } } 来源: oschina 链接: https:

二叉树遍历

心已入冬 提交于 2019-12-01 02:39:53
public class BinaryTree { public static void main(String[] args) { Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.left = new Node(6); root.right.right = new Node(7); print(root); } /** * 先序遍历:访问根结点的操作发生在遍历其左右子树之前。 根节点 -> 左子树 -> 右子树 1 2 4 5 3 6 7 * 中序遍历:访问根结点的操作发生在遍历其左右子树中间。 左子树 -> 根节点 -> 右子树 4 2 5 1 6 3 7 * 后序遍历:访问根结点的操作发生在遍历其左右子树之后。 左子树 -> 右子树 -> 根节点 4 5 2 6 7 3 1 * */ public static void print(Node root) { if (root == null) { return; } // 先序遍历,这行是第一次来到该节点 // System.out.print(root.value + " ");

根据先序遍历和中序遍历建立二叉树

感情迁移 提交于 2019-12-01 02:13:05
问题 ​ 已知一棵二叉树的先序遍历以及中序遍历,重建二叉树。二叉树的每一个节点有三个属性,左子节点,右子节点,以及节点值。 思路 先序遍历服从规则 “根左右” ,所以由此可知,对于一个先序遍历得到的数组,第一个元素一定是 根节点 ; 中序遍历服从规则 ”左根右“ ,所以由此可知,对于一个中序遍历得到的数组,根节点左边的元素都属于根节点的 左子树 ,而根节点右边的元素都属于根节点的 右子树 ; 所以,我们可以先通过先序遍历的第一个元素确定根节点,然后通过中序遍历结合根节点,获得当前根节点的左右子树,再将子树看成一棵独立的树,继续使用先序遍历判断根节点,中序遍历判断子树的方式,最终建立起整棵树; 例子 假设有一棵二叉树,先序遍历为 {1,2,4,7,3,5,6,8} ,中序遍历为 {4,7,2,1,5,3,8,6} ,则建树过程如下: 首先,通过先序遍历可知树的根节点为 1 ,则在中序遍历中,1左边的元素 4,7,2 即为根的左子树的元素,而 1 右边的元素 5,3,8,6 即为根节点的右子树; 对于左子树 4,7,2 来说,在先序遍历中,这三个点的顺序为 2,4,7 ,则 2 为根节点,而在中序遍历中, 4,7 均在 2 的左边,则 4,7 均为以 2 为根树的左子树,且没有右子树; 对于 4,7 这两个节点来说,先序遍历中, 4 节点在7节点之前,所以 4 为根节点,而 7

NOIp初赛题目整理

寵の児 提交于 2019-12-01 00:21:50
NOIp初赛题目整理 这个 blog 用来整理扶苏准备第一轮 csp 时所做的与 csp 没 有 关 系 的历年 noip-J/S 初赛题目,记录了一些我从不知道的细碎知识点,还有一些憨憨题目,不定期更新。 1、(07senior,5) 在C 语言中,表达式 \(23~\mid~2~\land^~5\) 的值是( ) ​ A. \(23\) B. \(1\) C. \(18\) D. \(32\) E. \(24\) Answer:A Solution:这题一看就是要考运算符优先级来着。在 \(C\) 语言中, 按位与大于按位异或大于按位或 ,这里的大于指优先级大于,优先级越大越优先计算,因此计算过程为 \(2~\land~5~=~7\) 。然后计算 \(23~\mid~7 = 23\) 。 需要指出的是,左右移的优先级大于上述三个运算,因此 \(C\) 语言表达式 1 | p << 1 是先算 p << 1 ,再对 \(1\) 取或,例如 \(1~\mid~3~<<~1\) 的答案是 \(9\) 。 2、(07senior,12) 与十进制数 \(17.5625\) 对应的 \(8\) 进制数是( )。 ​ A. \(21.5625\) B. \(21.44\) C. \(21.73\) \(D.21.731\) Answer:B Solution:这里介绍一下分数的进制转换

二叉树遍历的几种实现

試著忘記壹切 提交于 2019-11-30 23:22:38
用c++是实现的二叉树的存储以及几种遍历方法 #include<iostream> #include<cstdlib> #include<stack> //使用stl中的栈模板 using namespace std; typedef struct BNode{ //定义节点的结构体 char data; //数据部分 BNode* Lc; //左孩子 BNode* Rc; //右孩子 }Bitree,*pBitree; pBitree CreatTree(pBitree root){ //利用递归存树 char c; cin>>c;//输入节点数据 if(c!='#'){ root = (pBitree)malloc(sizeof(Bitree)); root->data=c; root->Lc=CreatTree(root->Lc); root->Rc=CreatTree(root->Rc); } else root = NULL; return root; } void norecursionInorder1(pBitree root){ //不用递归的中序遍历1 stack<pBitree> st; pBitree p; st.push(root); while(!st.empty()){ while(st.top()!=NULL) { p=st.top(); st

图解数据结构-树及树的遍历

末鹿安然 提交于 2019-11-30 14:58:14
当你第一次学习编码时,大部分人都是将数组作为主要数据结构来学习。 之后,你将会学习到哈希表。如果你是计算机专业的,你肯定需要选修一门数据结构的课程。上课时,你又会学习到链表,队列和栈等数据结构。这些都被统称为线性的数据结构,因为它们在逻辑上都有起点和终点。 当你开始学习树和图的数据结构时,你会觉得它是如此的混乱。因为它的存储方式不是线性的,它们都有自己特定的方式存储数据。 定义 树是众所周知的非线性数据结构。它们不以线性方式存储数据。他们按层次组织数据。 树的定义 树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。 在任意一颗非空树中: (1) 有且仅有一个 特定的称为根(Root)的结点。 (2)当n>1时,其余结点可分为m(m>0)个 互不相交的有限集 T1、T2、.....、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 下图就符合树的定义: 其中根结点A有两个子树: 我们硬盘的文件系统就是很经典的树形结构。 “树”它具有以下的特点: ①每个节点有零个或多个子节点; ②没有父节点的节点称为根节点; ③每一个非根节点有且只有一个父节点; ④除了根节点外,每个子节点可以分为多个不相交的子树; 树( tree )是被称为结点( node )的实体的集合。结点通过边( edge )连接。每个结点都包含值或数据( value/date )

二叉树的遍历

若如初见. 提交于 2019-11-30 13:42:57
·1.Binary Tree Preorder Traversal 使用栈,时间复杂度O(n),空间复杂度O(n) public static void preOrderRec(Node root){ if (root != null) s.push(root); while (!s.isEmpty()) { final TreeNode p = s.pop(); result.add(p.val); if (p.right != null) s.push(p.right); if (p.left != null) s.push(p.left); } 递归先序遍历,时间复杂度O(n),空间复杂度O(n) public static void preOrderRec(Node root){   if(root!=null){   System.out.println(root.value);   preOrderRec(root.left);   preOrderRec(root.right); } } Morris先序遍历,时间复杂度O(n),空间复杂度O(1) 步骤: 1.如果当前节点的左孩子为空,则输出当前节点并将其右孩子作为当前节点。 2.如果当前节点的左孩子不为空,在当前节点的左子树中找到当前节点在中序遍历下的前驱节点。 a) 如果前驱节点的右孩子为空

二叉树搜索树中序遍历下的前驱节点与后继节点

守給你的承諾、 提交于 2019-11-30 13:34:31
前驱节点 前驱节点的值小于该节点的值,是该节点左子树中值最大的 后继节点 后继节点的值大于该节点的值,是该节点右子树中值最小的 因为二叉搜索树的中序遍历出来的结果就是一棵树节点上的值的升序排序,所以一个数的前驱节点的值就是比它小一个的数,后继节点的值就是比它大一个的节点 找前驱节点有以下情况: (1) 该节点有左子树,那么该节点的前驱节点就是其左子树中最大的那个。例如 10 它有左孩子,它的前驱节点就是左孩子中最大的也就是 8 。 (2) 该节点没有左子树,那么就又有两种情况: 1. 该节点是其父节点的右孩子,那么它的前驱就是他的父节点; 例如 17 它的前驱就是16 2. 该节点是其父节点的左孩子,那么就得往其祖辈寻找直到找到它祖辈是左孩子为止,如果没找到,那么说明该节点没有前驱节点。 例如 8 它是左孩子,所以它的前驱不是它的父亲,就得往上找, 而它的父亲是他爷爷的右孩子,所以 8 的前驱就应该是它的爷爷 7 。 找后继节点有以下情况: (1) 该节点有右子树,那么该节点的后继节点就是其右子树中最小的那个。例如 10 它有右子树 它的后继就是右子树中最小的那个 14 。 (2) 该节点没有右子树,那么它的后继节点也要往祖辈里面找,也是分两种情况 : 1. 该节点是其父节点的左子树,那么它的后继节点就是他的父亲; 2. 该节点是父节点的左子树, 那么往上找

二叉树先序、中序、后续遍历非递归

心不动则不痛 提交于 2019-11-30 13:20:01
1 ** 2 * 二叉树先序遍历非递归 3 * @param root 4 */ 5 public void preOrder_no_recursive(TreeNode root){ 6 if(root == null) return; 7 8 Stack<TreeNode> stack = new Stack<>(); 9 stack.add(root); 10 while(!stack.isEmpty()){ 11 TreeNode tn = stack.pop(); 12 System.out.println(tn.val); // 输出 13 if(tn.right != null) stack.add(tn.right); 14 if(tn.left != null)stack.add(tn.left); 15 } 16 } 17 18 /** 19 * 二叉树中序遍历非递归 20 * @param root 21 */ 22 public void inOrder_no_recursive(TreeNode root){ 23 if(root==null)return; 24 Stack<TreeNode> stk = new Stack<TreeNode>(); 25 TreeNode p = root;//辅助节点 26 stk.add(p); 27 while