java实现二叉树的创建和遍历

    这两天一直忙着考试,最近才刚刚有时间补上上次的坑。

    这次完善了遍历。有前中后的递归和非递归方法,还有层序遍历。

    递归就不讲了。非递归用到了栈,层序遍历用到了队列。

    非递归:先创建一个空栈。在新建一个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();
	}
}

点赞