二叉树的前序遍历
前序遍历,即逻辑是根节点-----左节点-----右节点
这里分为递归方式和非递归方式
递归方式
/**
* 节点定义
*/
public static class Tree {
Tree left;
Tree right;
int val;
public Tree(int val) {
this.val = val;
}
}
/**
* 递归的先序遍历
*/
public static void preTraversing(Tree root) {
// 1.判空
if (root == null) {
return;
}
// 输出根节点
System.out.print(root.val + " ");
// 2.递归左节点
preTraversing(root.left);
// 3. 递归右节点
preTraversing(root.right);
}
非递归方式
思路: 其实非递归,则通过栈来实现,递归的过程我们可以理解为不断的入栈和不断的出栈的过程。
代码中的思路步骤已经写的很清楚了;
/**
* 非递归的先序遍历
*
* @param root
*/
public static void preTraversing1(Tree root) {
// 1.判空
if (root == null) {
return;
}
// 2.定义栈,并把树压入栈中
LinkedList<Tree> stack = new LinkedList<>();
stack.push(root);
// 3.判断栈是否为空
while (!stack.isEmpty()) {
// 4.弹出栈中元素
Tree currentTree = stack.pop();
// 5.先输出根节点的值
System.out.print(currentTree.val + " ");
// 6.先将右节点压入栈中,因为栈的特性,先入后出,所以压入右,在压入左,则先弹出的是左
if (currentTree.right != null) {
stack.push(currentTree.right);
}
// 7.压入左节点
if (currentTree.left != null) {
stack.push(currentTree.left);
}
}
}
二叉树的中序遍历
中序遍历的逻辑是: 左节点------根节点----右节点
同样有递归方式和非递归方式
递归方式
/**
* 递归的中序遍历: 左节点-跟节点-右节点
*/
public static void midTraversing(Tree root) {
// 1.判空
if (root == null) {
return;
}
// 2.递归左节点
preTraversing(root.left);
// 输出根节点
System.out.print(root.val + " ");
// 3. 递归右节点
preTraversing(root.right);
}
非递归方式
/**
* 非递归方式的中序遍历
* @param root
*/
public static void midTraversing1(Tree root) {
// 1.判空
if (root == null) {
return;
}
// 2.定义栈
LinkedList<Tree> stack = new LinkedList<>();
Tree currentNode = root;
while (currentNode!=null || !stack.isEmpty()) {
// 3.遍历出左子树中额所有左节点,压入栈中
while (currentNode!=null) {
stack.push(currentNode);
currentNode = currentNode.left;
}
// 3.弹出栈,并输出
currentNode = stack.pop();
System.out.print(currentNode.val+" ");
currentNode = currentNode.right;
}
}