一、先序遍历
思路:先输出当前节点,前序遍历左子树,前序遍历右子树
1 //先序遍历 2 //递归 3 public static void preOrder(BitNode root){ 4 root.visitNode(); 5 if(root.lchild != null) 6 preOrder(root.lchild); 7 if(root.rchild != null) 8 preOrder(root.rchild); 9 10 } 11 //非递归,先输出再入栈 12 public static void preOrder1(BitNode root){ 13 Stack<BitNode> stack = new Stack<BitNode>(); 14 while(root != null || !stack.empty()){ 15 while(root != null){ //沿左孩子走到底,同时输出 16 System.out.print(root.data+" "); 17 stack.push(root); 18 root = root.lchild; 19 } 20 if(!stack.empty()){ //出栈,并将非空右孩子入栈 21 root = stack.pop(); 22 root = root.rchild; 23 } 24 25 } 26 }
二、中序遍历
思路:中序遍历左子树,输出当前节点,中序遍历右子树
1 //中序遍历 2 //递归 3 public static void inOrder(BitNode root){ 4 if(root.lchild != null){ 5 inOrder(root.lchild); 6 } 7 root.visitNode(); 8 if(root.rchild != null){ 9 inOrder(root.rchild); 10 } 11 } 12 //非递归,先入栈,后面先出栈再输出,出栈后将非空右孩子压入栈,空则继续弹出 13 public static void inOrder1(BitNode root) { 14 Stack<BitNode> stack = new Stack<>(); 15 while (root != null || !stack.empty()) { 16 while (root != null) { 17 stack.push(root); 18 root = root.lchild; 19 } 20 if (!stack.empty()) { 21 root = stack.pop(); 22 System.out.print(root.data+" "); 23 root = root.rchild; 24 } 25 } 26 }
三、后序遍历
思路:后序遍历左子树,后序遍历右子树,输出当前节点
1 //后序遍历 2 //递归 3 public static void postOrder(BitNode root){ 4 if(root.lchild != null){ 5 postOrder(root.lchild); 6 } 7 if(root.rchild != null){ 8 postOrder(root.rchild); 9 } 10 root.visitNode(); 11 } 12 //非递归 13 public static void postOrder1(BitNode root){ 14 Stack<BitNode> stack = new Stack<>(); 15 BitNode pre = null,cur; 16 stack.push(root); 17 while (!stack.empty()){ 18 cur = stack.peek(); 19 //若栈顶节点当前无左右节点则可输出并出栈,或者其左右节点被访问过(左节点:说明无右节点,右节点:说明有左右节点或者无左节点) 20 if((cur.lchild == null && cur.rchild == null)||(pre != null && (pre == cur.lchild ||pre == cur.rchild))){ 21 cur.visitNode(); 22 stack.pop(); 23 pre = cur; 24 } 25 else {//注意顺序,先放入右节点,再放入左节点,后进先出 26 if(cur.rchild != null) 27 stack.push(cur.rchild); 28 if(cur.lchild != null) 29 stack.push(cur.lchild); 30 } 31 } 32 33 }
四、层次遍历
思路:利用队列先进先出,左右孩子进入队列后,当前节点从队列中删除
1 //层次遍历,根据队列来控制循环,出队并输出,将左右孩子入队 2 // 首先将根节点入队,队列若不为空则出队一个节点并输出,然后判断其左右节点是否为空,不为空则则入队 3 public static void levelTraverse(BitNode root){ 4 Queue<BitNode> queue = new LinkedList<BitNode>(); 5 queue.offer(root); 6 while(!queue.isEmpty()){ 7 BitNode bitNode = queue.poll(); 8 bitNode.visitNode(); 9 if(bitNode.lchild != null) 10 queue.offer(bitNode.lchild); 11 if(bitNode.rchild != null) 12 queue.offer(bitNode.rchild); 13 } 14 }