欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

十四.实现二叉树的先序、中序、后序遍历,包括递归方式和非递归 方式

程序员文章站 2022-05-16 10:08:49
...

【题目】

实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式

【分析】

先序遍历:中左右

非递归的思路:1.建立一个栈存放结点;2.栈中不为空的时候,弹出节点并且打印,相当于打印的是中间的位置;3.先压入的是弹出节点的右节点,在压入左节点(保证弹出的时候左节点先打印)。

中序遍历:左中右

非递归的思路
不为空的话,入栈,节点一直向左移动;为空的话,出栈,打印,节点向右移动。

后序遍历:左右中

非递归的思路
1.先构造中右左的结构(就是先序遍历中先放左孩子,再放右孩子);
2.在准备一个栈,调换一下顺序就变成了左右中结构

【先序遍历代码实现】

//1.构造节点结构
	public static class Node{
		int value;
		Node left;
		Node right;
		public Node(int data) {
			this.value=data;
		}
	}
	
	//2.先序遍历递归(中左右)
	public static void preOrderRecur(Node head) {
		if (head==null) {
			return;
		}
		System.out.print(head.value+" ");
		preOrderRecur(head.left);
		preOrderRecur(head.right);
	}
	
	//3.先序遍历非递归(中左右)
	public static void preOrderUnRecur(Node head) {
		if(head!=null) {
		//3.1 建立一个栈结构,把第一个压进去
			Stack<Node> stack=new Stack<>();
			stack.add(head);
			while(!stack.isEmpty()) {
			//3.2 栈中不为空的话,弹出一个(就是头结点),打印了中间的节点
				cur=stack.pop();
				System.out.print(cur.value+" ");
				//3.3 当前弹出的节点的右节点压进去
				if (cur.right!=null) {
					stack.push(head.right);
				}
				//3.3 当前弹出的节点的左节点压进去,出来的时候想出来左节点 保证了中左右的顺序
				if (cur.left!=null) {
					stack.push(cur.left);
				}
			}
		}
		System.out.println();
	}

【中序遍历代码实现】

//1.构造节点结构
	public static class Node{
		int value;
		Node left;
		Node right;
		public Node(int data) {
			this.value=data;
		}
	}
	
	//2.中序遍历递归(左中右)
	public static void inOrderRecur(Node head) {
		if (head==null) {
			return;
		}
		inOrderRecur(head.left);
		System.out.print(head.value+" ");
		inOrderRecur(head.right);
	}

    //3.中序遍历非递归(左中右)
	public static void inOrderUnRecur(Node head) {
			if (head!=null) {
				Stack< Node> stack=new Stack<>();
				while(head!=null||!stack.isEmpty()) {
				//1.如果节点不为空,压栈,下一步是她的左孩子(找到最左)
					if(head!=null) {
						stack.push(head);
						head=head.left;
					}
					//2.如果节点为空,出栈,打印,下一步是她的右孩子
					else {
						Node cur = stack.pop();
						System.out.print(cur.value+" ");
						cur=cur.right;
					}
				}
			}
			System.out.println();
		}

【后序遍历代码实现】

				//1.后序遍历递归(左右中)
				public static void posOrderRecur(Node head) {
					if (head==null) {
						return;
					}
					posOrderRecur(head.left);
					posOrderRecur(head.right);
					System.out.print(head.value+" ");
				}
				
			//2.后序遍历非递归(左右中)
				public static void posOrderUnRecur(Node head) {
					if (head!=null) {
						Stack<Node> stack1=new Stack<>();
						Stack<Node> stack2=new Stack<>();
						stack1.push(head);
						while(!stack1.isEmpty()) {
							Node cur=stack1.pop();
							//弹出一个压一个
							stack2.push(cur);
							if (cur.left!=null) {
								stack1.push(cur.left);
							}
							if(cur.right!=null) {
								stack1.push(cur.right);
							}
						}
						while(!stack2.isEmpty()) {
							System.out.print(stack2.pop().value+" ");
						}
					System.out.println();
					}
				}
相关标签: 二叉树