二叉树遍历小结

本文总结了二叉树的遍历方法,包括广度优先遍历和深度优先遍历(递归与迭代方式)以及莫里斯算法。深度优先遍历包括先序、中序和后序,而莫里斯算法则提供了一种空间复杂度为O(1)的遍历方法。
摘要由CSDN通过智能技术生成

前言

二叉树是相当重要的数据结构,目前我还只会玩玩它的遍历(年轻不懂事没好好学,不然早就达到人生巅峰了),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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值