二叉树遍历

算法——图的深度优先遍历和广度优先遍历

你。 提交于 2020-02-27 14:26:45
更多参考: 深度优先遍历:深度优先遍历是图论中的经典算法。其利用了深度优先搜索算法可以产生目标图的相应拓扑排序表,采用拓扑排序表可以解决很多相关的图论问题,如最大路径问题等等。 根据深度优先遍历的特点我们利用Java集合类的栈Stack先进后出的特点来实现。我用二叉树来进行深度优先搜索。 深度优先搜索的步骤为: (1)首先节点 1 进栈,节点1在栈顶; (2)然后节点1出栈,访问节点1,节点1的孩子节点3进栈,节点2进栈; (3)节点2在栈顶,然后节点2出栈,访问节点2 (4)节点2的孩子节点5进栈,节点4进栈 (5)节点4在栈顶,节点4出栈,访问节点4, (6)节点4左右孩子为空,然后节点5在栈顶,节点5出栈,访问节点5; (7)节点5左右孩子为空,然后节点3在站顶,节点3出栈,访问节点3; (8)节点3的孩子节点7进栈,节点6进栈 (9)节点6在栈顶,节点6出栈,访问节点6; (10)节点6的孩子为空,这个时候节点7在栈顶,节点7出栈,访问节点7 (11)节点7的左右孩子为空,此时栈为空,遍历结束。 广度优先遍历:广度优先遍历是连通图的一种遍历策略,因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域故得名。 根据广度优先遍历的特点我们利用Java数据结构队列Queue来实现。 广度优先搜索的步骤为: (1)节点1进队,节点1出队,访问节点1 (2

死磕 java集合之TreeMap源码分析(四)-内含彩蛋

流过昼夜 提交于 2020-02-27 08:42:19
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。 二叉树的遍历 我们知道二叉查找树的遍历有前序遍历、中序遍历、后序遍历。 (1)前序遍历,先遍历我,再遍历我的左子节点,最后遍历我的右子节点; (2)中序遍历,先遍历我的左子节点,再遍历我,最后遍历我的右子节点; (3)后序遍历,先遍历我的左子节点,再遍历我的右子节点,最后遍历我; 这里的前中后都是以“我”的顺序为准的,我在前就是前序遍历,我在中就是中序遍历,我在后就是后序遍历。 下面让我们看看经典的中序遍历是怎么实现的: public class TreeMapTest { public static void main(String[] args) { // 构建一颗10个元素的树 TreeNode<Integer> node = new TreeNode<>(1, null).insert(2) .insert(6).insert(3).insert(5).insert(9) .insert(7).insert(8).insert(4).insert(10); // 中序遍历,打印结果为1到10的顺序 node.root().inOrderTraverse(); } } /** * 树节点,假设不存在重复元素 * @param <T> */ class TreeNode<T extends

问题 D: 二叉树遍历

此生再无相见时 提交于 2020-02-25 22:40:23
题目链接 : http://codeup.cn/problem.php?cid=100000611&pid=3 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。 输入 输入包括1行字符串,长度不超过100。 输出 可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。 样例输入 a#b#cdef##### a## 样例输出 a b f e d c a 代码 # include <cstdio> char pre [ 110 ] ; int i ; struct node { char data ; node * lchild ; node * rchild ; } ; node * create ( ) { if ( pre [ i ] == '#' ) { i ++ ; return NULL ; } node * root = new node ; root -> data = pre [ i ] ; i ++ ; root -> lchild = create ( ) ; root ->

leetcode987. 二叉树的垂序遍历

二次信任 提交于 2020-02-25 20:09:46
leetcode987. 二叉树的垂序遍历 给定二叉树,按垂序遍历返回其结点值。 对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1) 和 (X+1, Y-1)。 把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们按从上到下的顺序报告结点的值( Y 坐标递减)。 如果两个结点位置相同,则首先报告的结点值较小。 按 X 坐标顺序返回非空报告的列表。每个报告都有一个结点值列表。 示例 1: 输入:[3,9,20,null,null,15,7] 输出:[[9],[3,15],[20],[7]] 解释: 在不丧失其普遍性的情况下,我们可以假设根结点位于 (0, 0): 然后,值为 9 的结点出现在 (-1, -1); 值为 3 和 15 的两个结点分别出现在 (0, 0) 和 (0, -2); 值为 20 的结点出现在 (1, -1); 值为 7 的结点出现在 (2, -2)。 示例 2: 输入:[1,2,3,4,5,6,7] 输出:[[4],[2],[1,5,6],[3],[7]] 解释: 根据给定的方案,值为 5 和 6 的两个结点出现在同一位置。 然而,在报告 “[1,5,6]” 中,结点值 5 排在前面,因为 5 小于 6。 提示: 树的结点数介于 1 和 1000 之间。 每个结点值介于 0 和

二叉树的后序遍历(迭代版本)

守給你的承諾、 提交于 2020-02-24 13:45:44
二叉树的后序遍历相比较前序和中序复杂一些。我们需要一个标记来记忆我们此时节点上一个节点。 具体的java代码如下: // 二叉树的后序遍历 public static void postOrderTraverWithStack(TreeNode node){ Stack<TreeNode> stack = new Stack<>(); TreeNode treeNode = node; // 标记位 TreeNode lastVisit = null; while(treeNode != null || !stack.isEmpty()){ while(treeNode != null){ stack.push(treeNode); treeNode = treeNode.leftChild; } // 栈不为空 if(!stack.isEmpty()){ // 出栈 treeNode = stack.pop(); /*** * 这块就是判断treeNode是否有右孩子, * 如果没有输出treeNode.data, 让lastVisit指向treeNode, 并让treeNode为空 * 如果有右孩子, 将当前节点继续入栈,treeNode指向它的有孩子,继续重复循环 */ // 这里其实是访问到根节点后有两条路径,一个是当没有右孩子或者右孩子被访问过后, // 打印根节点

二叉树,二叉树遍历,二叉树搜索

帅比萌擦擦* 提交于 2020-02-23 14:56:52
树形结构 树形结构应该就比较容易理解了,树是二维数据结构中的一种,至于说二叉树又是树的一种了。 树和图的区别在这里说明一下,重点: 树形结构为二维数据结构中的一种特殊结构 1.树形结构有一个根节点 2.树形结构没有回路(就是只能一直往下,有回路的称为图,树是图的一种) 3.树形结构我们称为 有向循环图 几个关键字,拓补结构,树,图,有向循环图 二叉树 就三种,一种根节点,一种节点,一种叶子节点 二叉树,就是只有两个枝的结构 二叉树代码实现: //二叉树结构 function Rout(value) { this.value = value; this.left = null; this.right = null; } // 赋值 var a = new Rout("a"); var b = new Rout("b"); var c = new Rout("c"); var d = new Rout("d"); var e = new Rout("e"); var f = new Rout("f"); var g = new Rout("g"); // 结构图 a.left = b; a.right = c; b.left = d; b.right = e; c.left = f; c.right = g; 跟节点应该好理解 叶子节点:下边没有其他节点 节点:既不是根节点

二叉树的中序遍历

旧巷老猫 提交于 2020-02-20 03:05:08
题目: 思路: 利用栈做迭代: 先遍历所有节点,直到找到最左节点,将这个节点的父节点抛出,加入栈,再遍历右子树. 代码: class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: ans,res=[],[] while ans or root: if root: ans.append(root) root=root.left else: root=ans.pop() res.append(root.val) root=root.right return res 来源: CSDN 作者: 海边的一只猿 链接: https://blog.csdn.net/qq_29760277/article/details/104400213

数据结构-栈

放肆的年华 提交于 2020-02-17 14:14:03
数据结构-栈 单调栈解决 Next Greater Number 一类问题 给一个字符串或一个数组要求对其进行分析 给一个字符串进行分析 给一个数组进行分析 二叉树的遍历 前序遍历 中序遍历 后续遍历 基本的核心思想就是:当解决某个问题的时候,只关心最近一次的操作,并且在操作完成了之后,需要向前查找到更前一次的操作 每次处理只对栈顶元素进行处理 单调栈解决 Next Greater Number 一类问题 这里题目是给定一个数组,找出每一个元素之后比它大的数值或者索引号。最粗暴的方法就是遍历数组,但是这是一个 O ( n 2 ) O(n^2) O ( n 2 ) 复杂度的方法。 思想: 利用排队的思想,比如找第一个元素2的Next Greater Number,那么就是找那个比2要高的,不被2挡住的第一个元素,那就是4,以此类推。 利用栈,从数组的后面开始遍历,逐个入栈,实际出栈顺序却是正序。 vector < int > nextGreaterElement ( vector < int > & nums ) { vector < int > ans ( nums . size ( ) ) ; // 存放答案的数组 stack < int > s ; for ( int i = nums . size ( ) - 1 ; i >= 0 ; i -- ) { // 倒着往栈里放

7、重建二叉树

别来无恙 提交于 2020-02-17 02:13:41
重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路分析 前序遍历的确定根节点,可以根据此点分别找到左子树跟右子树的前序遍历序列和中序遍历序列,通过递归再分别构建子树的左子树和右子树。代码如下: public TreeNode reConstructBinaryTree ( int [ ] pre , int [ ] in ) { return reConstructBinaryTree ( pre , 0 , pre . length - 1 , in , 0 , in . length - 1 ) ; } public TreeNode reConstructBinaryTree ( int [ ] pre , int preStart , int preEnd , int [ ] in , int inStart , int inEnd ) { if ( preStart > preEnd || inStart > inEnd ) return null ; TreeNode root = new TreeNode ( pre [ preStart ] ) ; for

【数据结构】树

我的未来我决定 提交于 2020-02-16 18:28:58
树 客观世界中许多事物存在层次关系 eg:人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率 查找(Searching):给定某个关键字K,从集合R中找出关键字与K相同的记录 静态查找:集合中记录是固定的 没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的 除查找,还可能发生查找和删除 静态查找 顺序查找 typedef struct LNode *List; struct LNode{ ElementType Element[MAXSIZE]; int Length; } int SequentialSearch(List Tb1, ElementType K){ int i; Tb1->Element[0]=K;//哨兵!这样可以减少判断 for(i=Tb1->Length;Tb1->Element[i]!=K;i--); return i; } 二分查找 Binary Search O(log(n)) 假设n个数据元素的关键字满足有序 \(k_1<k_2<k_3<...<k_n\) ,并且是连续存放(数组),那么可以进行二分查找。 typedef LNode *List; struct LNode{ ElementType Element[MAXSIZE]; int Length; } int BinarySearch(List PtrL