二叉树的前序、中序、后序、层次遍历,递归与非递归实现。在实现时,需要注意递归思想以及在非递归实现时使用了什么数据结构,以及为什么使用这些数据结构!好记性不如烂笔头,坐下笔记!
构建二叉树的数据结构
/**
* 构建二叉树的数据结构
*
* @author wolf
* @create 2018-07-29 18:09
*/
public class BinaryTree {
int val;
BinaryTree left;
BinaryTree right;
public BinaryTree(int val) {
this.val = val;
}
}
前序遍历的 递归与非递归实现
递归实现
实现思路:先根节点,再左节点,最后右节点。构建递归时有两个要点需要特别注意,一是递归结束的条件,一是递归表达式(即递归如何进行下去)。
/**
* 前序遍历递归方式实现
* 递归适应思想,构建递归时有两个要点需要特别注意,一是递归结束的条件,一是递归表达式(即递归如何进行下去)
*
* @param root 二叉树的根节点
*/
public void preorderBT(BinaryTree root) {
//结束条件
if (root == null)
return;
//递归主体
System.out.print(root.val + " ");
preorderBT(root.left);
preorderBT(root.right);
}
非递归实现
非递归实现思路:二叉树遍历的递归实现很简单,也很容易理解,在进行非递归实现时,需要用到栈这种数据结构(为什么是栈,不是别的数据结构)。因为递归实现的过程就是程序自己在处理圧栈和弹栈,改用非递归实现时,用栈模拟系统的圧栈与弹栈,就可以了。具体代码如下,结合注释看, 可以很容易理解。
/**
* 前序遍历非递归方式实现
* 非递归实现思路:二叉树遍历的递归实现很简单,也很容易理解,在进行非递归实现时,需要用到栈这种数据结构(为什么是栈,不是别的数据结构)。
* 因为递归实现的过程就是程序自己在处理圧栈和弹栈,改用非递归实现时,用栈模拟系统的圧栈与弹栈,就可以了。
*/
public List<Integer> preorderBT1(BinaryTree root) {
List<Integer> preorderResu