您的位置:首页 > 其它

树的深度优先遍历和广度优先遍历非递归实现.

2015-12-17 19:28 155 查看
注:树的深度优先遍历就是二叉树的先序遍历.

下面是我用java实现的代码.

package com.datastruct;

import java.util.LinkedList;
import java.util.Stack;

public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

/*
*树的深度优先遍历
*按树的每一条分支遍历树
*利用一个栈进行辅助
*/
public void DeepFirstSearch_NoRecursion(TreeNode root)
{
Stack<TreeNode> treeStack = new Stack<>();

if(root == null)
{
return;
}

treeStack.add(root);

while(!treeStack.isEmpty())
{
TreeNode currentNode =  treeStack.pop();//栈顶元素出栈
System.out.print(currentNode.val);//访问节点

/*深搜需要先访问左子树的一条分支,故右孩子先入栈*/
if(currentNode.right != null)
{
treeStack.push(currentNode.right);
}

if(currentNode.left != null)
{
treeStack.push(currentNode.left);
}
}
}

/*
*广度优先遍历
*按照树的每一层进行遍历
*利用一个队列进行辅助
*/
public void BreadFirstSearch_NoRecursion(TreeNode root)
{
LinkedList<TreeNode> treeQueue = new LinkedList<>();//用链表来模拟队列

if(root == null)
{
return;
}

treeQueue.add(root);

while(!treeQueue.isEmpty())
{
TreeNode currenNode = treeQueue.getFirst(); //获取队首元素

System.out.println(currenNode.val);//访问节点

if(currenNode.left != null)
{
treeQueue.add(currenNode.left);//左子树进队列
}

if(currenNode.right != null)
{
treeQueue.add(currenNode.right);//右子树进队列
}

treeQueue.removeFirst();//队首元素访问完出队列
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: