赞
踩
二叉树是相当重要的数据结构,目前我还只会玩玩它的遍历(年轻不懂事没好好学,不然早就达到人生巅峰了),LeetCode上二叉树的简单题,大部分通过遍历加一点小逻辑即可解决,所以总结一下几种遍历方法(其实也是看题解白嫖的)。
二叉树遍历有广度优先,深度优先两种方式,深度优先又分先序遍历(根,左,右),中序遍历(左,根,右),后序遍历(左,右,根),如果是二叉搜索树,中序遍历就是有序的了。广度优先方式没太多说,只能借助队列实现,而深度优先,可通过递归方式,借助栈迭代方式,还有一种巧妙的莫里斯算法,空间复杂度是O(1),但莫里斯算法应该会改变树的结构。
首先将根结点入队,然后只要队列非空,就出队一个元素,然后只要子节点不为空就入队,队列为空时,就是遍历完成时
public int bfs(TreeNode root) { Queue<TreeNode> queue=new LinkedList<TreeNode>(); if(null!=root){ queue.add(root); } int depth=0; while(!queue.isEmpty()){ depth++; int size = queue.size(); //这两行不要也可以,按queue不为空就可以完成遍历 for(int i=0;i<size;i++){ //size可以控制一层一次循环,可以获取当前的高度 TreeNode curNode=queue.poll(); if(null!=curNode.left){ queue.add(curNode.left); } if(null!=curNode.right){ queue.add(curNode.right); } } } return depth; }
递归方式代码很简洁,调整一下顺序前中后序遍历也都出来了。然后不断地嵌套函数调用,不管哪种语言每次函数调用操作系统都需要压栈,JVM中每次方法调用也是需要创建栈帧,如果数据量大会消耗大量内存,肯定会抛出StackOverflowError
1.先序 public void dfs(TreeNode root) { if(null==root){ return; } System.out.println(root.val); dfs(root.left); dfs(root.right); } 2.中序 public void dfs(TreeNode root) { if(null==root){ return; } dfs(root.left); System.out.println(root.val); dfs(root.right); } 根右左遍历 public void dfs(TreeNode root) { if
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。