前言
二叉树是相当重要的数据结构,目前我还只会玩玩它的遍历(年轻不懂事没好好学,不然早就达到人生巅峰了),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
本文总结了二叉树的遍历方法,包括广度优先遍历和深度优先遍历(递归与迭代方式)以及莫里斯算法。深度优先遍历包括先序、中序和后序,而莫里斯算法则提供了一种空间复杂度为O(1)的遍历方法。
最低0.47元/天 解锁文章
1151

被折叠的 条评论
为什么被折叠?



