二叉树的深度优先遍历(递归、非递归),广度优先遍历(递归)
2017-12-05 10:53
148 查看
一、二叉树的深度优先遍历(DFS)有递归和非递归两种方法,递归很简单,先上递归代码
1.递归:
public void depthOrderTraversalWithRecursive()
{
depthTraversal(root);
}
private void depthTraversal(TreeNode tn)
{
if (tn!=null&&!tn.equals(null))
{
System.out.print(tn.value+" ");
depthTraversal(tn.left);
depthTraversal(tn.right);
}
}
递归思路很明显,就是先根,遍历左子树,遍历右子树,这和我博客前两篇文章递归创建二叉树的方法一样,核心就是3行。二叉树的深度优先遍历就是先序遍历
2.非递归:
非递归的DFS需要用到栈,利用栈的先进后出的特性,先将根节点入栈,栈不空时pop,然后右子树入栈,再左子树入栈。
二、二叉树的广度优先遍历,也就是层次遍历,用非递归比较简单,需要用到队列。先将根入队,队列不空时pop,然后入左子树,再入右子树
这些代码我都是直接复制粘贴网上大佬写好了的,我自己是用python写的递归的深度遍历,但是因为我代码中dfs只是个过程函数,没有单独写出来,所以不方便放在博客上,这些代码是帮助我以后复看理解的
1.递归:
public void depthOrderTraversalWithRecursive()
{
depthTraversal(root);
}
private void depthTraversal(TreeNode tn)
{
if (tn!=null&&!tn.equals(null))
{
System.out.print(tn.value+" ");
depthTraversal(tn.left);
depthTraversal(tn.right);
}
}
递归思路很明显,就是先根,遍历左子树,遍历右子树,这和我博客前两篇文章递归创建二叉树的方法一样,核心就是3行。二叉树的深度优先遍历就是先序遍历
2.非递归:
非递归的DFS需要用到栈,利用栈的先进后出的特性,先将根节点入栈,栈不空时pop,然后右子树入栈,再左子树入栈。
/** * 深度优先遍历,相当于先根遍历 * 采用非递归实现 * 需要辅助数据结构:栈 */ public void depthOrderTraversal(){ if(root==null){ System.out.println("empty tree"); return; } ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>(); stack.push(root); while(stack.isEmpty()==false){ TreeNode node=stack.pop(); System.out.print(node.value+" "); if(node.right!=null){ stack.push(node.right);#####先入右子树 } if(node.left!=null){ stack.push(node.left);#####后入左子树 } } System.out.print("\n"); }
二、二叉树的广度优先遍历,也就是层次遍历,用非递归比较简单,需要用到队列。先将根入队,队列不空时pop,然后入左子树,再入右子树
* 广度优先遍历 * 采用非递归实现 * 需要辅助数据结构:队列 */ public void levelOrderTraversal(){ if(root==null){ System.out.println("empty tree"); return; } ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>(); queue.add(root); while(queue.isEmpty()==false){ TreeNode node=queue.remove(); System.out.print(node.value+" "); if(node.left!=null){ queue.add(node.left); } if(node.right!=null){ queue.add(node.right); } } System.out.print("\n"); }
这些代码我都是直接复制粘贴网上大佬写好了的,我自己是用python写的递归的深度遍历,但是因为我代码中dfs只是个过程函数,没有单独写出来,所以不方便放在博客上,这些代码是帮助我以后复看理解的
相关文章推荐
- 二叉树构建,先序,中序,后序遍历(以及非递归实现),广度优先遍历
- 二叉树的深度优先遍历(先、中、后序方式-递归和非递归)和广度优先遍历
- 二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的递归建立以及深度优先遍历
- 二叉树的遍历(递归和非递归)
- LeetCode-Construct Binary Tree from Preorder and Inorder Traversal-前序中序恢复二叉树-递归
- 二叉树的递归创建以及前序,中序,后序遍历
- C++实现二叉树前序中序后续遍历的非递归方法总结
- 算法导论第十章习题10.4-3非递归方式实现二叉树的中序遍历
- 二叉树非递归
- 二叉树的先序以及后序递归建立,先中后序递归遍历。
- Java 递归形式深度优先遍历二叉树
- 数据结构之图的深度优先遍历和广度优先遍历
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- 【数据结构基础】二叉树的建立和递归遍历
- 二叉树前序、中序和后序非递归遍历的方法
- 重建二叉树并非递归前序/中序/后序遍历
- java版 二叉树 所有递归和非递归遍历算法
- 二叉树中节点的最大距离(递归,动态规划)