先序遍历:
/*
* A
* / \
* B C
* / \ / \
* D E F G
* / \ \ /
* H I J P
*
*
*
*
*/
//先序遍历DLR(ABDEHI CFJGP)
public ArrayList<Node> preorderTraversal(Node node){//非递归先序遍历
ArrayList<Node> list=new ArrayList<>();
Stack<Node> stack=new Stack<>();
while(!stack.isEmpty()||node!=null){
while(node!=null){
list.add(node);
stack.push(node);
node=node.left;
}
node=stack.pop();
node=node.right;
}return list;
}
中序遍历:
/*
* A
* / \
* B C
* / \ / \
* D E F G
* / \ \ /
* H I J P
*
*
*
*
*/
//中序遍历二叉树LDR,所有的节点都是LDR (DBHEIA FJCPG)
public ArrayList<Node> inorderTraversal(Node node){//非递归中序遍历
ArrayList<Node> list=new ArrayList<>();
Stack<Node> stack=new Stack<>();
while(!stack.isEmpty()||node!=null){
while(node!=null){
stack.push(node);
node=node.left;
}
node=stack.pop();
list.add(node);
node=node.right;
}return list;
}
后序遍历:
先按中右左遍历,再反转为左右中;
/*
* A
* / \
* B C
* / \ / \
* D E F G
* / \ \ /
* H I J P
*
*
*
*
*/
//后序遍历二叉树LRD(DHIEB JFPGCA)
public ArrayList<Node> postorderTraversal(Node node){//非递归后序遍历
ArrayList<Node> list=new ArrayList<>();
Stack<Node> stack=new Stack<>();
while (!stack.isEmpty()||node!=null){
while(node!=null){
list.add(0,node);//反转
stack.push(node);
node=node.right;
}
node=stack.pop();
node=node.left;
}return list;
}
本文介绍了二叉树的三种遍历方式:先序遍历、中序遍历及后序遍历,并提供了非递归实现的具体代码示例。
8716

被折叠的 条评论
为什么被折叠?



