二叉树的深度优先遍历(递归、非递归),广度优先遍历(递归)
一、二叉树的深度优先遍历(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只是个过程函数,没有单独写出来,所以不方便放在博客上,这些代码是帮助我以后复看理解的
---------------------
作者:咕咕咕cun
来源:CSDN
原文:https://blog.csdn.net/lznsay/article/details/78717117
版权声明:本文为博主原创文章,转载请附上博文链接!

浙公网安备 33010602011771号