前序遍历

二叉树遍历,查找,删除节点,线索化

霸气de小男生 提交于 2019-12-11 10:41:30
二叉树很明显就只有两个分叉,及左子节点和右子节点,这里主要是说明二叉树的遍历,查找节点和删除节点,线索化这几种。 遍历分为前序遍历,中序遍历,后序遍历这三种,前,中,后是相对中间节点来说的,及前序比那里是先中间节点,在左边节点,最后右边节点。 下面是前序遍历代码: public void preOrder(){ System.out.println(this); if(this.left!=null) { this.left.preOrder(); } if(this.right!=null) { this.right.preOrder(); } } 这是节点的前序遍历,在二叉树里面遍历还需要判断给的节点是不是空: public void preOrder() { if(this.root!=null) { this.root.preOrder(); //调用上面的preOrder方法。 }else { System.out.println("二叉树为空"); } } 中序和后序遍历和上面差不多,就是输出顺序不一样,可以自行参照对比。 查找节点:也分为前序遍历查找。中序遍历查找,后序遍历查找。 前序遍历查找思路:就是按照中间节点,左子树,右子树的顺序遍历找到相同节点就赋值,然后退出,没找到就返回一个空节点。 代码如下:也分为节点的遍历和二叉树的遍历,二叉树的遍历要判断是否为空 /

二叉树的遍历总结

人走茶凉 提交于 2019-12-11 04:45:37
二叉树的遍历总结 前序遍历[leetcode144] 遍历方式:“根结点-左孩子-右孩子” 递归(Recursive) /** * 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 ) { vector < int > res , left , right ; if ( ! root ) return res ; res . push_back ( root - > val ) ; left = preorderTraversal ( root - > left ) ; for ( auto & x : left ) res . push_back ( x ) ; right = preorderTraversal ( root - > right ) ; for ( auto & x : right ) res . push_back ( x ) ;

重建二叉树

白昼怎懂夜的黑 提交于 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

二叉树与堆

谁说胖子不能爱 提交于 2019-12-09 22:23:01
二叉树有哪几种存储方式?哪种适合于用数组来存储? node 数组存储? 两种特殊二叉树 满二叉树:除了叶子节点之外,每个节点都有左右两个子节点 完全二叉树:叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大 节点的高度:节点到叶子节点的最长路径 节点的深度:根节点到这个节点的边的个数,从0开始 节点的层数:节点的深度加1,从1开始 树的高度:根节点的高度 树结构的存储: 1)链式存储法:节点=数据+左节点指针+右节点指针 2)数组存储法: 如果是完全二叉树:根节点存储在下标为1,那左子节点存储在下标 2 * i = 2 的位置,右子节点存储在 2 * i + 1 = 3 的位置。 如果节点 X 存储在数组中下标为 i 的位置,下标为 2 * i 的位置存储的就是左子节点,下标为 2 * i + 1 的位置存储的就是右子节点。反过来,下标为 i/2 的位置存储就是它的父节点。通过这种方式,我们只要知道根节点存储的位置(一般情况下,为了方便计算子节点,根节点会存储在下标为 1 的位置),这样就可以通过下标计算,把整棵树都串起来。 二叉树的遍历: 前序遍历 中序遍历 后序遍历 二叉查找树: 任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值 查找:类似二分查找 插入:也是先查找

Java--哈夫曼树创建和遍历

时光总嘲笑我的痴心妄想 提交于 2019-12-09 21:49:30
哈夫曼树的创建和遍历 import java.util.*; public class huffman { public static void main(String[] args) { int []arr={13,7,8,3,29,6,1}; Node root=huff(arr); //前序遍历打印赫夫曼树 if(root!=null){ System.out.println("赫夫曼树前序遍历为:"); root.preOrder();} else{ System.out.println("赫夫曼树为空"); } } //创建赫夫曼树 public static Node huff(int []arr){ //创建Node类型的集合,便于存取节点 List<Node>nodes=new ArrayList<Node>(); for(int a:arr){ nodes.add(new Node(a));//注意:此处是把Node类型节点放入,所以构造新的对象 } while(nodes.size()>1){ //排序,小到大 Collections.sort(nodes);//对集合内部元素排序 //System.out.println(nodes); //(1)取两个节点最小的构建子树 Node left=nodes.get(0); Node right=nodes.get

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-07 22:00:39
我们知道计算机中各类应用程序随处可见的,而支撑这些应用程序运行的就是各类数据结构以及各类算法,这就是经典等式 程序=数据结构+算法 ,上一篇幅中我们列举了一些常用的数据结构,那么今天我们来捋一捋日常开发中常见的一些算法思想以及具体算法各自的特性及相关指标 文章目录 常见算法思想 穷举法(Brute Force) 核心思想 特性 适用问题或算法 分治法(Divide and Conquer) 核心思想 特性 适用问题或算法 贪心算法(Greedy) 核心思想 特性 适用问题或算法 动态规划法(Dynamic Programming) 核心思想 特性 适用问题或算法 回溯法(Backtracking) 核心思想 特性 适用问题或算法 分枝界限法(Branch and Bound) 关于递归(画外音) 贪心和动态规划(画外音) 常见的算法分类 排序算法 冒泡排序 插入排序 希尔排序 选择排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 排序算法总结 查找算法 顺序查找 二分查找 散列查找 二叉树查找 搜索算法 树的层次遍历 树的(前/中/后)序遍历 常见算法思想 我们首先介绍下几种常见的算法思想,日常中一些具体的解题算法的思想都依赖于它们,文中列举一些具体算法问题可以自行通过搜索引擎了解 穷举法(Brute Force) 核心思想 顾名思义就是列举出所有可能出现的情况

二叉树的遍历小记

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

二叉树的前中后序遍历

我们两清 提交于 2019-12-06 13:53:53
面试题:二叉树的前中后序遍历 二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。 前序遍历:前序遍历的顺序为根-左-右中序遍历:中序遍历的顺序为左-根-右后序遍历:后序遍历的顺序为左-右-根层次遍历: 从上到下,每一个层次从左到右 前序遍历 import java.util.ArrayList;import java.util.List;import java.util.Stack;/** * Given a binary tree, return the preorder traversal of its TreeNodes' values. */public class Lc144 { /* * 前序遍历 :根左右 思路;将当前节点压入栈中,一直遍历左子树知道当前节点为空,向上弹出遍历一下右子树。 */ public static List<Integer> preorderTraversal(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); List<Integer> list = new ArrayList<>(); TreeNode curr = root; while (curr != null || !stack.isEmpty()) { while (curr != null) { list

leetcode 145. 二叉树的后序遍历

混江龙づ霸主 提交于 2019-12-06 12:59:54
给定一个二叉树,返回它的 后序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 1 //递归算法 2 class Solution { 3 public List<Integer> postorderTraversal(TreeNode root) { 4 List<Integer> list = new ArrayList<Integer>(); 5 if(root==null) return list; 6 postorder(root,list); 7 return list; 8 } 9 public List<Integer> postorder(TreeNode node,List<Integer> list){ 10 if(node.left!=null)postorder(node.left,list); 11 if(node.right!=null)postorder(node.right,list); 12 list.add(node.val); 13 return list; 14 } 15 } 16 //迭代算法 17 class Solution { 18 public List<Integer> postorderTraversal(TreeNode root) { 19 List<Integer> list