二叉树遍历

重建二叉树

白昼怎懂夜的黑 提交于 2019-12-10 15:16:52
重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 遍历方式 前序遍历:根->左子树->右子树 中序遍历:左子树-> 根 -> 右子树 后序遍历:左子树 —> 右子树 —> 根结点 层次遍历:按层次遍历 重建二叉树 中序+其他任意一种遍历==唯一二叉树 解题思路 递归 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ 1.找到根结点 前序遍历 第一个节点为根节点, 后序遍历 最后一个点为根节点。 题目中根节点为1 2.确定左右子树 中序遍历中找到根节点的位置,根节点左边为左子树(4,7,2),右边的为右子树(5,3,8,6) 3.递归 左右子树分别看作一个新的树,对应新的前序和中序遍历序列(怎么确定新的遍历序列看接下来的代码),进行递归求解。 public class Solution { public TreeNode

4-树篇

天大地大妈咪最大 提交于 2019-12-09 15:09:23
题一:【重建二叉树】输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析:根据示例可以知道,前序遍历序列第1个为根节点,再根据中序遍历序列可以得到根节点的左右子树{472},{5386};由前序遍历左子树{2 4 7}可以直到左子树根节点为2,再根据中序遍历左子树{472}可以再次分为左右子树……依次递推; 拓展: Arrays.copyOfRange(arr, i , j );复制数组,包括索引i,不包括索引j; 1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 import java.util.Arrays; 11 public class Solution { 12 public TreeNode reConstructBinaryTree(int [] pre,int [] in) { 13 if(pre

数据结构 树(上)

不打扰是莪最后的温柔 提交于 2019-12-08 05:02:32
数据结构 树(上) 一、概述   主要内容包含树的基本概念、二叉树(平衡二叉树、完全二叉树、满二叉树)、搜索树(二叉搜索树、平衡搜索树、AVL树、伸展树、(2,4)树、红黑树)、(a,b)树、B树等实际运用的树数据结构 二、基本知识(树的定义和属性) 1、树(非线性数据结构)运用于一些算法实现的效率会比线性数据结构(基于数组的列表和链表)快,广泛运用于文件系统目录结构、图形用户界面、MySQL数据库索引、网站、路由协议和其他计算机系统中 2、树T定义为存储一系列元素的有限节点集合,这些节点具有 parent-children 关系且满足属性:一、如果树T不为空,则它一定具有一个称为根节点 r 的特殊节点,并且该节点没有父节点;二、每个非根节点 v 都具有唯一的父节点 w ,每个具有父节点 w 的节点都是节点 w 的一个孩子 3、一个没有孩子的节点 v 称为外部节点或者叶子节点,一个有一个或多个孩子的节点 v 称为内部节点 4、树的边:一对具有父子关系的节点(u,v);树的路径:一系列节点,这些节点中任意两个连续的节点都具有父子关系 5、节点P的祖先:从根节点到该节点P所经路径上的所有节点;节点P的子孙:以该节点P为根节的子树中任意一个节点都是节点P的子孙 6、有序树:如果树中的每个节点的孩子节点都有特定的顺序,称为有序树。有序树:二叉树、霍夫曼树(信息编码)、B树

字节跳动移动端多媒体研发岗面试

橙三吉。 提交于 2019-12-06 17:59:46
一面 1、自我介绍 2、项目介绍 3、智能指针 4、菱形继承中父类有几份拷贝、虚继承 5、重载、重写、重定义的区别 6、多态是怎么实现的 7、构造、析构函数调用的顺序 8、static成员函数、static成员变量讲一下 9、数组和链表的区别 10、程序的内存空间。静态变量存储位置、heap和stack存储区的区别 11、数组指针、指针数组 12、B树和B+树的区别 13、香农定理 14、卷积的意义 15、还有什么问题 二面 1、自我介绍 2、项目介绍 3、视频编解码的一些基础知识 4、你觉得视频编解码还有哪些优化方向 5、PSNR的含义 6、编程题 输入完全二叉树层次遍历,将完全二叉树进行镜像,层次遍历输出 7、还有什么问题 来源: CSDN 作者: _VioletHan_ 链接: https://blog.csdn.net/VioletHan7/article/details/83382682

二叉树的遍历小记

◇◆丶佛笑我妖孽 提交于 2019-12-06 14:23:39
二叉树前中后序的遍历的小总结:   其中在用栈实现前后序的遍历过程中,后续遍历可以看成前序遍历来实现,只是路径的方向正好和前序遍历相反,即从根节点的右标记点为起始,左标记点为终点,取得的结果取逆序就为后续遍历的结果,通过后续遍历的图一目了然。 来源: https://www.cnblogs.com/yysumer/p/11989595.html

二叉树的前中后序遍历

此生再无相见时 提交于 2019-12-06 09:48:27
面试题:二叉树的前中后序遍历 二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。前序遍历:前序遍历的顺序为根-左-右中序遍历:中序遍历的顺序为左-根-右后序遍历:后序遍历的顺序为左-右-根 1.前序遍历 思路:利用栈后进先出的特性。1.根结点入栈;2.循环取栈顶元素、右子结点入栈、左子结点入栈。JAVA参考代码public class TreeNode { int val; TreeNode left; TreeNode right;​ TreeNode(int val) { this.val = val; }}public List<Integer> preorderTree(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); List<Integer> preorder = new ArrayList<>();​ if (root == null) { return preorder; }​ stack.push(root); while (!stack.empty()) { TreeNode node = stack.pop(); preorder.add(node.val); if (node.right != null) { stack.push(node.right); } if (node

二叉树的迭代遍历以及递归遍历

痴心易碎 提交于 2019-12-06 05:08:14
二叉树的前序遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root == null){ return result; } result.add(root.val); inOrder(root.left);+ inOrder(root.right); return result; } 二叉树的中序遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root == null){ return result; } inOrder(root.left); result.add(root.val); inOrder(root.right); return result; } 二叉树的后续遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root =

二叉树的非递归遍历的思想

北慕城南 提交于 2019-12-06 04:37:16
最近在学习数据结构,从书上的代码示例中学习到了一种抽象的思考方式,记录一些学习二叉树的感悟 先序遍历 先序遍历相对简单,我一开实现的时候考虑了四种情况 左孩子为空 && 右孩子为空 访问根节点,然后出栈 左孩子不为空 && 右孩子为空 访问根节点,然后继续访问左孩子 左孩子为空 && 右孩子不为空 访问根节点,入栈右孩子,出栈 左孩子不为空 && 右孩子不为空 访问根节点,入栈右孩子,继续访问左孩子 template<typename Elemtype> template<typename Fun> bool BiTree<Elemtype>::PreOrderTraverse(Fun &visit){ Stack<BiTNode<Elemtype>*> S; InitStack<bool,BiTNode<Elemtype>*>(S); BiTNode<Elemtype> *p = root; while (p != nullptr) { visit(p); if(p->rChrilde != nullptr) Push<bool,BiTNode<Elemtype>*>(S,p->rChrilde); if(p->lChrilde != nullptr) p = p->lChrilde; else //如果栈空Pop()返回false,用于判断栈空结束循环 if(!Pop<bool

二叉树的前序遍历---迭代算法

旧街凉风 提交于 2019-12-06 03:23:31
二叉树的前序遍历   二叉树的前序遍历过程相当于先访问最左边路径上的所有节点,然后在从后往前访问各个节点的右子树, 因此应该想到要使用栈结构。访问当前的节点的同时将其右子树节点放入栈中等待访问。先序遍历的代码如 下: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> s; TreeNode* temp = root; // 当栈不为空或者root不为空节点时 while(!s.empty() || temp){ //`先遍历、访问、压栈左节点` while(temp){ s.push(temp); res.push_back(temp->val); temp = temp->left; } //当访问节点不存在左子树时,退栈对右子树进行访问 temp = s.top(); s.pop(); temp = temp->right; } return res; }   使用一个辅助栈的结构进行访问,访问当前的节点并将其右子树存入栈中,直到节点的左子树不存在时从栈中将节点取出,开始 迭代访问其右子树。 来源: https://www.cnblogs.com/wangkaia/p/11960183.html

PTA 树的遍历

喜欢而已 提交于 2019-12-05 08:52:45
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 用数组模拟二叉树,设根结点为n,左孩子编号为2n,右孩子编号为2n+1,以这种方式存储二叉树 按顺序输出则为层序遍历。下面就定义一个数组,然后不断在子递归中查找根结点,将根结点存入相应的数组位置中。 1 //下标从0开始 2 //post[]为已知的后序遍历元素,in[]为已知的中序遍历元素 3 //len-1为传进的post[]的根结点下标,len为在子递归函数(即左右子树)中的元素个数 4 //p为根在num[]中的存储位置,即左右孩子结点成为子递归的根 5 //p的起始位置是1 6 void Levelorder(int post[],int in[],int len,int p) 7 { 8 if(len < 1) //当子树没有元素时,返回 9 { 10 num[p] = -1; 11 return; 12 } 13 14 int i