后序遍历

二分搜索树(Binary Search Tree)

这一生的挚爱 提交于 2020-04-04 09:12:11
目录 什么是二叉树? 什么是二分搜索树? 二分搜索树的基本操作 二分搜索树添加新元素 二分搜索树的遍历(包含非递归实现) 删除二分搜索树中的元素 什么是二叉树?   在实现二分搜索树之前,我们先思考一下,为什么要有树这种数据结构呢?我们通过企业的组织机构、文件存储、数据库索引等这些常见的应用会发现,将数据使用树结构存储后,会出奇的高效,树结构本身是一种天然的组织结构。常见的树结构有:二分搜索树、平衡二叉树(常见的平衡二叉树有AVL和红黑树)、堆、并查集、线段树、Trie等。Trie又叫字典树或前缀树。   树和链表一样,都属于动态数据结构,由于二分搜索树是二叉树的一种,我们先来说说什么是二叉树。二叉树具有 唯一的根节点 ,二叉树每个节点 最多 有两个孩子节点,二叉树的每个节点 最多有一个父亲节点 ,二叉树具有天然递归结构,每个节点的左子数也是一棵二叉树,每个节点的右子树也是一颗二叉树。二叉树如下图: 什么是二分搜索树?   二分搜索树也是一种二叉树,但二分搜索树种每个节点的值都要大于其左子树所有节点的值,小于其右子树所有节点的值,每一棵子树也是二分搜索树。正因为二分搜索树的这种性质,二分搜索树存储的元素必须具有可比较性。下图就是一棵二分搜索树: 我们可以根据二分搜索树的特点,构建一颗二分搜索树,代码实现如下: /** * 由于二分搜索树中的元素必须具有可比较性

刷题226. Invert Binary Tree

不羁岁月 提交于 2020-03-31 08:45:12
一、题目说明 题目226. Invert Binary Tree,翻转一个二叉树。难度是Easy! 二、我的解答 这个题目,和二叉树的遍历类似。用递归方法(前、中、后序遍历,按层遍历都可以): class Solution{ public: TreeNode* invertTree(TreeNode* root){ if(root ==NULL) return root; TreeNode * p = root->left; root->left = root->right; root->right = p; root->left = invertTree(root->left); root->right = invertTree(root->right); return root; } }; 性能如下: Runtime: 4 ms, faster than 65.13% of C++ online submissions for Invert Binary Tree. Memory Usage: 10 MB, less than 5.45% of C++ online submissions for Invert Binary Tree. 三、优化措施 非递归的算法,下面用广度优先遍历实现: class Solution{ public: //non-recursive

二叉树的遍历(递归与非递归)

心不动则不痛 提交于 2020-03-24 11:59:55
非递归遍历二叉树是使用栈压栈和弹栈时机不同的思想,在非递归先序遍历中,根据"根左右"的访问顺序不同,先访问当前数据,然后依次压入右儿子和左子;在非递归后序遍历中,需要达到"左右根"的顺序,所以使用两个栈,栈2只存储访问的节点,根据先序遍历的思想修改顺序"根右左",先访问当前节点,然后依次压入左儿子和右儿子,最后输出栈2;在非递归中序遍历中,若当前节点不为空,就压栈,当前节点指向左儿子,若为空且栈不为空,就弹栈,当前节点指向右儿子. import java.util.Stack; public class TreeTraversal { public static class Node{ public int value; public Node left; public Node right; public Node(int Value) { value = Value; } } public void preOrder(Node head) { if(head != null) { System.out.print(head.value + " "); if(head.left != null) { preOrder(head.left); } if(head.right != null) { preOrder(head.right); } } } public void

Ehcache计算Java对象内存大小

最后都变了- 提交于 2020-03-24 06:25:00
在EHCache中,可以设置maxBytesLocalHeap、maxBytesLocalOffHeap、maxBytesLocalDisk值,以控制Cache占用的内存、磁盘的大小(注:这里Off Heap是指Element中的值已被序列化,但是还没写入磁盘的状态,貌似只有企业版的EHCache支持这种配置;而这里maxBytesLocalDisk是指在最大在磁盘中的数据大小,而不是磁盘文件大小,因为磁盘文中有一些数据是空闲区),因而EHCache需要有一种机制计算一个类在内存、磁盘中占用的字节数,其中在磁盘中占用的字节大小计算比较容易,只需要知道序列化后字节数组的大小,并且加上一些统计信息,如过期时间、磁盘位置、命中次数等信息即可,而要计算一个对象实例在内存中占用的大小则要复杂一些。 计算一个实例内存占用大小思路 在Java中,除了基本类型,其他所有通过字段包含其他实例的关系都是引用关系,因而我们不能直接计算该实例占用的内存大小,而是要递归的计算其所有字段占用的内存大小的和。在Java中,我们可以将所有这些通过字段引用简单的看成一种树状结构,这样就可以遍历这棵树,计算每个节点占用的内存大小,所有这些节点占用的内存大小的总和就当前实例占用的内存大小,遍历的算法有:先序遍历、中序遍历、后序遍历、层级遍历等。但是在实际情况中很容易出现环状引用(最简单的是两个实例之间的直接引用

Leetcode题解——数据结构之树

戏子无情 提交于 2020-03-21 09:06:04
递归 1. 树的高度 2. 平衡树 3. 两节点的最长路径 4. 翻转树 5. 归并两棵树 6. 判断路径和是否等于一个数 7. 统计路径和等于一个数的路径数量 8. 子树 9. 树的对称 10. 最小路径 11. 统计左叶子节点的和 12. 相同节点值的最大路径长度 13. 间隔遍历 14. 找出二叉树中第二小的节点 层次遍历 1. 一棵树每层节点的平均数 2. 得到左下角的节点 前中后序遍历 1. 非递归实现二叉树的前序遍历 2. 非递归实现二叉树的后序遍历 3. 非递归实现二叉树的中序遍历 BST 1. 修剪二叉查找树 2. 寻找二叉查找树的第 k 个元素 3. 把二叉查找树每个节点的值都加上比它大的节点的值 4. 二叉查找树的最近公共祖先 5. 二叉树的最近公共祖先 6. 从有序数组中构造二叉查找树 7. 根据有序链表构造平衡的二叉查找树 8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值 9. 在二叉查找树中查找两个节点之差的最小绝对值 10. 寻找二叉查找树中出现次数最多的值 Trie 1. 实现一个 Trie 2. 实现一个 Trie,用来求前缀和 递归 一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。 1. 树的高度 104. Maximum Depth of Binary Tree (Easy)

二叉树的创建与遍历

怎甘沉沦 提交于 2020-03-21 00:18:04
此时有这样一棵树,其先序遍历:ABCDEFGH;中序遍历:CBEDFAGH;后序遍历:CEFDBHGA;想要以输入结点的方式来创建树。可以考虑一个节点创建成功在创建其左右结点,若其左右结点为空,则返回至上一个结点继续创建,直到创建完毕。 创建树的结点: class BNode{ private BNode leftChild; private BNode rightChild; private char data; public BNode() { } public BNode(char data){ this.data = data; } public BNode(BNode leftChild,BNode rightChild,char data){ this.leftChild = leftChild; this.rightChild = rightChild; this.data = data; } public BNode getLeftChild() { return leftChild; } public void setLeftChild(BNode leftChild) { this.leftChild = leftChild; } public BNode getRightChild() { return rightChild; } public void

【树的遍历】

不问归期 提交于 2020-03-20 18:20:53
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数 N( ≤),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 #include <bits/stdc++.h> using namespace std; int a[35],b[35],n; struct node { int la,lb,ra,rb; node(int la,int ra,int lb,int rb):la(la),ra(ra),lb(lb),rb(rb){} }; void bfs() { int flag=1; queue <node> qu; qu.push(node(1,n,1,n)); while(!qu.empty()) { node t=qu.front(); qu.pop(); int la=t.la,lb=t.lb,ra=t.ra,rb=t.rb,root=a[ra]; if(flag) { cout<<root; flag=0; } else cout<<" "<

【算法日常】二叉树常用遍历方法

坚强是说给别人听的谎言 提交于 2020-03-17 14:56:13
二叉树的遍历 本篇算一个资料整理,就是二叉树遍历方法, 有先序遍历(PreOrder)、中序遍历(InOrder)、后序遍历(PostOrder)、广度优先遍历二叉树(breadth_first_search)、深度优先遍历(depth_first_search) 示例遍历二叉树: 二叉树节点格式: class TreeNode: def __init__(self, val): self.val = val self.left = self.right = None 1. 先序遍历 PreOrder 先遍历根节点,再遍历左子树,最后遍历右子树 def pre_order(root: TreeNode) -> list: if not root: return [] return [root.val] + pre_order(root.left) + pre_order(root.right) #### 遍历结果 ## [4, 2, 1, 3, 6, 5, 7] 2. 中序遍历 InOrder 先遍历左子树,再遍历根节点,最后遍历右子树, def in_order(root: TreeNode) -> list: if not root: return [] return in_order(root.left) + [root.val] + in_order(root.right)

Java中二叉树的层序遍历

自古美人都是妖i 提交于 2020-03-17 11:08:49
二叉树除了前序遍历、中序遍历、后序遍历之外,还有一种遍历方式,那就是层序遍历,它是将二叉树按照层次进行遍历的一种方法。 首先,需要定义节点类,代码如下: public class TreeNode { int value ; TreeNode left ; TreeNode right ; public TreeNode ( ) { value = 0 ; left = right = null ; } public TreeNode ( int value ) { this . value = value ; left = right = null ; } } 层序遍历 对于代码的实现,我们可以利用队列来实现。 public void leverOrder ( TreeNode root ) { Queue < TreeNode > queue = new LinkedList < > ( ) ; if ( root != null ) { queue . offer ( root ) ; } while ( ! queue . isEmpty ( ) ) { //获取队头元素 TreeNode topNode = queue . poll ( ) ; System . out . print ( topNode . value + " " ) ; //入队孩子节点 if (

由前序遍历和中序遍历重建二叉树

牧云@^-^@ 提交于 2020-03-15 16:50:59
编程之美3.9:给出前序遍历和中序遍历,重新创建二叉树,后序遍历输出。代码如下: View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 struct Node 7 { 8 Node* m_lChild; 9 Node* m_rChild; 10 char data; 11 }; 12 13 void AfterTra(Node* pRoot) 14 { 15 if (!pRoot) 16 { 17 return; 18 } 19 AfterTra(pRoot->m_lChild); 20 AfterTra(pRoot->m_rChild); 21 cout<<pRoot->data<<" "; 22 } 23 24 //删除树的操作 25 void DestroyTree(Node*& pRoot) 26 { 27 if (!pRoot) 28 { 29 return; 30 } 31 DestroyTree(pRoot->m_lChild); 32 DestroyTree(pRoot->m_rChild); 33 delete pRoot; 34 } 35 36 //计算树中的节点个数 37 int TreeSize(Node* pRoot) 38 { 39 if (