前、中、后序遍历二叉树

二叉树的遍历:前序遍历,中序遍历,后序遍历,层次遍历

 

如何进行前序遍历:

1、  先遍历树根

2、  然后前序遍历左子树

3、  再前序遍历右子树

 

如何进行中序遍历:

1、  先中序遍历左子树

2、  然后遍历树根

3、  再中序遍历右子树

 

如何进行后序遍历:

1、  先后序遍历左子树

2、  然后后序遍历右子树

3、  再遍历树根

前序:ABDEGCF

中序:DBGEACF

后序:DGEBFCA

 

代码示例:

 

package com.sise.recursion;
/*
 * 遍历
 */
public class TreeTraversal {
	/*
	 * 前序遍历
	 */
	public void preOrder(TreeNode root) {
		if(root==null){
			return;
		}
		System.out.print(root.getValue());
		preOrder(root.getLeft());
		preOrder(root.getRighe());
	}
	
	/*
	 * 中序遍历
	 */
	public void inOrder(TreeNode root) {
		if(root==null){
			return;
		}
		inOrder(root.getLeft());
		System.out.print(root.getValue());
		inOrder(root.getRighe());
	}
	
	/*
	 * 后序遍历
	 */
	public void postOrder(TreeNode root) {
		if(root==null){
			return;
		}
		postOrder(root.getLeft());
		postOrder(root.getRighe());
		System.out.print(root.getValue());
	}
	
	
	public static void main(String[] args) {
		TreeCreator creator=new TreeCreator();
		TreeTraversal traversal=new TreeTraversal();
		
		TreeNode sampleTree=creator.createSampleTree();
		System.out.print("前序:");
		traversal.preOrder(sampleTree);
		System.out.println();
		System.out.print("中序:");
		traversal.inOrder(sampleTree);
		System.out.println();
		System.out.print("后序:");
		traversal.postOrder(sampleTree);
		System.out.println();
	}
}

package com.sise.recursion;

/*
 * 建树
 */
public class TreeCreator {
	public TreeNode createSampleTree() {
	TreeNode root=new TreeNode('A');
	root.setLeft(new TreeNode('B'));
	root.getLeft().setLeft(new TreeNode('D'));
	root.getLeft().setRighe(new TreeNode('E'));
	root.getLeft().getRighe().setLeft(new TreeNode('G'));
	root.setRighe(new TreeNode('C'));
	root.getRighe().setRighe(new TreeNode('F'));
	return root;
	}
}

package com.sise.recursion;

public class TreeNode {
	private final char value;
	private TreeNode left;
	private TreeNode righe;
	
	public TreeNode (char value) {
		this.value=value;
		this.left=null;
		this.righe=null;
	}

	public TreeNode getLeft() {
		return left;
	}

	public void setLeft(TreeNode left) {
		this.left = left;
	}

	public TreeNode getRighe() {
		return righe;
	}

	public void setRighe(TreeNode righe) {
		this.righe = righe;
	}

	public char getValue() {
		return value;
	}
	
	
}

运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树的遍历,有三种主要的方法:序遍历、中序遍历和后序遍历,它们都是非递归实现的。以下是每种遍历方式的描述: 1. **序遍历(Preorder Traversal)**: - 先访问根节点(根-左-右) - 非递归实现通常使用栈,将当节点压入栈,然后访问当节点,再将左子树(如果存在)和右子树(如果存在)依次压入栈。 2. **中序遍历(Inorder Traversal)**: - 先访问左子树(左-根-右) - 非递归实现同样用栈,但顺序不同:先遍历左子树,然后访问当节点,最后访问右子树。 3. **后序遍历(Postorder Traversal)**: - 先访问左子树和右子树(左-右-根) - 这是相对复杂的一种,因为最后才访问根节点,所以需要两个栈。首先遍历左右子树,将节点压入栈,最后弹出栈元素并访问它们,直到栈为空。 对于非递归实现,核心思想是利用栈的数据结构来模拟递归过程的调用栈。每一步都对应着递归调用的压栈、访问和出栈操作。下面是基本步骤: - 序:`push(root); while (stack) { node = stack.pop(); visit(node); if (node->right) push(node->right); if (node->left) push(node->left); }` - 中序:`if (root) { inorder_traversal(root->left); visit(root); inorder_traversal(root->right); }` - 后序:`if (root) { stack.push(root); while (stack) { node = stack.top(); if (node->left == NULL && node->right == NULL) { visit(node); stack.pop(); } else if (node->right == NULL) { visit(node->left); stack.pop(); } else { visit(node->right); stack.pop(); } } }`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值