1905011打卡:递归和非递归方式实现二叉树的先中后序遍历

题目描述:
用递归和非递归的方式,分别按照二叉树的先序,中序和后序打印所有节点,先序遍历顺序为根,左,右;中序遍历顺序为左,根,右;后序遍历为左,右,根

import java.util.Stack;

public class Code_023_PreInPosTraversal {
	
	public static class Node {
		public int data;
		public Node left;
		public Node right;
		public Node(int data) {
			this.data = data;
		}
	}
	
	public static void preOrderRecur(Node head) {
		if (head == null) {
			return;
		}
		
		System.out.print(head.data + " ");
		preOrderRecur(head.left);
		preOrderRecur(head.right);
	}
	
	public static void inOrderRecur(Node head) {
		if (head == null) {
			return;
		}
		
		inOrderRecur(head.left);
		System.out.print(head.data + " ");
		inOrderRecur(head.right);
	}
	
	public static void posOrderRecur(Node head) {
		if (head == null) {
			return;
		}
		
		posOrderRecur(head.left);
		posOrderRecur(head.right);
		System.out.print(head.data + " ");
	}
	
	//先压右,后压左
	public static void preOrderUnRecur(Node head) {
		if (head != null) {
			Stack<Node> stack = new Stack<>();
			stack.push(head);
			while(!stack.isEmpty()) {
				head = stack.pop();
				System.out.print(head.data + " ");
				if (head.right != null) {
					stack.push(head.right);
				}
				
				if (head.left != null) {
					stack.push(head.left);
				}
			}
			System.out.println();
		}
	}
	
	public static void inOrderUnRecur(Node head) {
		if (head != null) {
			Stack<Node> stack = new Stack<>();
			while(!stack.isEmpty() || head != null) {
				if (head != null) {
					stack.push(head);
					head = head.left;
				} else {
					head = stack.pop();
					System.out.print(head.data + " ");
					head = head.right;
				}
			}
			System.out.println();
		}
	}
	
	//先实现中右左,就是将先序的遍历进行修改,把先序中该打印的压入到另一个栈中,然后在依次从栈中弹出,这样就可以实现后序的左右中的遍历
	public static void posOrderUnRecur(Node head) {
		if (head != null) {
			Stack<Node> s1 = new Stack<>();
			Stack<Node> s2 = new Stack<>();
			s1.push(head);
			while(!s1.isEmpty()) {
				head = s1.pop();
				s2.push(head);
				if (head.left != null) {
					s1.push(head.left);
				}
				if (head.right != null) {
					s1.push(head.right);
				}
			}
			
			while(!s2.isEmpty()) {
				System.out.print(s2.pop().data + " ");
			}
		}
	}
	
	public static void main(String[] args) {
		Node head = new Node(5);
		head.left = new Node(3);
		head.right = new Node(8);
		head.left.left = new Node(2);
		head.left.right = new Node(4);
		head.left.left.left = new Node(1);
		head.right.left = new Node(7);
		head.right.left.left = new Node(6);
		head.right.right = new Node(10);
		head.right.right.left = new Node(9);
		head.right.right.right = new Node(11);

		// recursive
		System.out.println("==============recursive==============");
		System.out.print("pre-order: ");
		preOrderRecur(head);
		System.out.println();
		System.out.print("in-order: ");
		inOrderRecur(head);
		System.out.println();
		System.out.print("pos-order: ");
		posOrderRecur(head);
		System.out.println();

		// unrecursive
		System.out.println("============unrecursive=============");
		preOrderUnRecur(head);
		inOrderUnRecur(head);
		posOrderUnRecur(head);

	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值