当前位置:   article > 正文

二叉树遍历小结_二叉树的遍历实验总结

二叉树的遍历实验总结

前言

二叉树是相当重要的数据结构,目前我还只会玩玩它的遍历(年轻不懂事没好好学,不然早就达到人生巅峰了),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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

深度优先遍历

递归方式

递归方式代码很简洁,调整一下顺序前中后序遍历也都出来了。然后不断地嵌套函数调用,不管哪种语言每次函数调用操作系统都需要压栈,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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/933752
推荐阅读
相关标签
  

闽ICP备14008679号