这两天一直忙着考试,最近才刚刚有时间补上上次的坑。
这次完善了遍历。有前中后的递归和非递归方法,还有层序遍历。
递归就不讲了。非递归用到了栈,层序遍历用到了队列。
非递归:先创建一个空栈。在新建一个node节点并赋值root。如果node不为空或栈不为空就一直循环。循环体中的内容见代码,很容易理解。另外要注意非递归后序遍历时,需要有个标记记录左子树是否被访问过,如果被访问过,才能输出。
层序遍历,先将root放入队列中,每次取出后,将不空的node节点的左右子树放入队里中。直到队列为空结束。
package tree.binarytree;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class BinaryTree {
private static Node root;
private static String [] treeNodes;
static int index;
public BinaryTree(String tree) {
root = new Node("");
treeNodes = tree.split(",");
index = 0;
createTree(root);
}
public static Node createTree(Node node) {
String data = treeNodes[index];
System.out.println("index "+index+" data "+data);
index++;
if(data.equals("#")){
return null;
}else {
node.setData(data);;
node.setLchild(createTree(new Node("")));
node.setRchild(createTree(new Node("")));
return node;
}
}
//递归实现先序遍历
public void recurPreOrder() {
preOrder(root);
}
//非递归先遍历
public void nonRecurPreOrder() {
Stack<Node> stack = new Stack<>();
//root 这里默认不空
Node node = root;
//走到左尽头
while(node!=null||!stack.isEmpty()) {
if(node!=null) {
visit(node);
stack.push(node);
node=node.getLchild();
}else {
node=stack.pop();
//visit(node)在这就是中序遍历
node=node.getRchild();
}
}
}
public void nonRecurPostOrder() {
Stack<Node> stack = new Stack<>();
//root 这里默认不空
Node node = root;
//走到左尽头
while(node!=null||!stack.isEmpty()) {
if(node!=null) {
//visit(node);
node.setStatus('R');
stack.push(node);
node=node.getLchild();
}else {
node=stack.pop();
//visit(node)在这就是中序遍历
if(node.getStatus()=='R')
visit(node);
node=node.getRchild();
}
}
}
//层序遍历
public void seqOrder() {
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()) {
Node node = queue.poll();
visit(node);
if(node.getLchild()!=null)
queue.add(node.getLchild());
if(node.getRchild()!=null)
queue.add(node.getRchild());
}
}
public int getTreeHeight() {
int height = height(root);
return height;
}
private void visit(Node node) {
if(node!=null)
System.out.print(node.getData()+" ");
else
System.out.println("VISIT ERROR!");
}
private void preOrder(Node node) {
if(node==null)
return;
visit(node);//改变visit的顺序即可
preOrder(node.getLchild());
preOrder(node.getRchild());
}
private int height(Node node) {
if (node == null)
return 0;// 递归结束:空树高度为0
else {
int i = height(node.getLchild());
int j = height(node.getRchild());
return (i < j) ? (j + 1) : (i + 1);
}
}
public Node getRoot() {
return root;
}
}
测试类
package tree.binarytree;
public class BinaryTreeTest {
public static void main(String[] args) {
BinaryTree tree = new BinaryTree("A,B,#,D,#,#,C,#,#");
tree.nonRecurPreOrder();
System.out.println();
tree.nonRecurPostOrder();
}
}