1、 二叉树的层次遍历
import java.util.LinkedList;
public void levelIterator(BiTree root){
if(root == null){
return ;
}
LinkedList<BiTree> queue = new LinkedList<BiTree>();
BiTree current = null;
queue.offer(root);
while(!queue.isEmpty()){
current = queue.poll();
System.out.print(current.val +"-->");
if(current.left != null){
queue.offer(current.left);
}
if(current.right != null){
queue.offer(current.right);
}
}
}
2、 二叉树的前、中、后序遍历
递归方式:
public void preOrder(Node node){
if(node != null){
System.out.print(node.data);
preOrder(node.leftChild);
preOrder(node.rightChild);
}
}
public void inOrder(Node node){
if(node != null){
inOrder(node.leftChild);
System.out.print(node.data);
inOrder(node.rightChild);
}
}
public void postOrder(Node node){
if(node != null){
postOrder(node.leftChild);
postOrder(node.rightChild);
System.out.print(node.data);
}
}
非递归方式遍历
public void preOrder(Node root) {
Stack<Node> stack = new Stack<Node>();
Node node = root;
while (node != null || stack.size() > 0) {
if (node != null) {
System.out.print(node.data);
stack.push(node);
node = node.leftChild;
} else {
node = stack.pop();
node = node.rightChild;
}
}
}
public void inOrder(Node root) {
Stack<Node> stack = new Stack<Node>();
Node node = root;
while (node != null || stack.size() > 0) {
if (node != null) {
stack.push(node);
node = node.leftChild;
} else {
node = stack.pop();
System.out.print(node.data);
node = node.rightChild;
}
}
}
public void postOrder(Node root) {
Stack<Node> stack = new Stack<Node>();
Stack<Node> output = new Stack<Node>();
Node node = root;
while (node != null || stack.size() > 0) {
if (node != null) {
output.push(node);
stack.push(node);
node = node.rightChild;
} else {
node = stack.pop();
node = node.leftChild;
}
}
while (output.size() > 0) {
System.out.print(output.pop().data);
}
}
3、 图的深度优先遍历和广度优先遍历
/**
* 图的点
*/
class NodeT {
List<ArcT> outgoing;
String word;
public NodeT(String word){
this.word=word;
outgoing=new ArrayList<ArcT>();
}
}
/**
* 单个图点的关系
*/
class ArcT {
NodeT pre,next;
public ArcT(NodeT pre,NodeT next){
this.pre=pre;
this.next=next;
}
}
public void deptFisrtSearch(NodeT cur,List<NodeT> visited){
if(visited.contains(cur)) return;
visited.add(cur);
System.out.println("这个遍历的是:"+cur.word);
for(int i=0;i<cur.outgoing.size();i++){
deptFisrtSearch(cur.outgoing.get(i).next,visited);
}
}
/**
* 广度优先遍历,类似于二叉树的层次遍历
* 这个方法的方式:按层次对图进行访问,先第一层,再第二层,依次类推
* @param start 从哪个开始广度排序
*/
void widthSearch(NodeT start){
Set<NodeT> visited=new HashSet<NodeT>();
Queue<NodeT> q=new LinkedList<NodeT>();
q.offer(start);
while(!q.isEmpty()){
NodeT cur=q.poll();
if(!visited.contains(cur)){
visited.add(cur);
System.out.println("查找的节点是:"+cur.word);
for(int i=0;i<cur.outgoing.size();i++){
q.offer(cur.outgoing.get(i).next);
}
}
}
}
}