定义Node节点的数据格式
public class Node {
public String value;
public Node left;
public Node right;
public Node(String value) {
this.value = value;
}
}
构造二叉树
Node nodeA = new Node("A");
Node nodeB = new Node("B");
Node nodeC = new Node("C");
Node nodeD = new Node("D");
Node nodeE = new Node("E");
Node nodeF = new Node("F");
Node nodeG = new Node("G");
nodeA.left = nodeB;
nodeA.right = nodeC;
nodeB.left = nodeD;
nodeB.right = nodeE;
nodeC.right = nodeF;
nodeE.left = nodeG;
栈的pop(),push()每次只能操作一个对象
二叉树的先序遍历
非递归先序遍历二叉树时,需要注意栈先入后出的特性, 故需要先将右子树放入栈中!!!!
//递归遍历
public static void preOrder1(Node root){
if (root == null)return;
System.out.print(root.value);
preOrder1(root.left);
preOrder1(root.right);
}
//栈遍历
public static void preOrder2(Node root){
if (root == null)return;
Stack<Node> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
Node node = stack.pop();
System.out.print(node.value);
if (node.right != null)stack.push(node.right);
if (node.left != null)stack.push(node.left);
}
}
二叉树的中序遍历
非递归中序遍历二叉树时,首次pop出的应该是每棵子树最左侧的叶节点,因此需要先遍历至它,然后再pop输出。
具体实现为使用双指针标记位置,cur用来标记当前的结点信息,node用来标记每个子树遍历至最左侧的叶子结点,对node执行pop操作后,再遍历当前根节点和当前节点的右子树
//递归遍历
public static void midOrder1(Node root){
if (root == null)return;
preOrder1(root.left);
System.out.print(root.value);
preOrder1(root.right);
}
//栈遍历
public static void midOrder1(Node root){
if(root == null)return;
Stack<Node> stack = new Stack<>();
Node cur = root;
while (!stack.isEmpty() || cur != null){
while (cur != null){
stack.push(cur);
cur = cur.left;
}
Node node = stack.pop();
System.out.print(node.value);
if (node.right != null)cur = node.right;
}
}
二叉树的后序遍历
由于非递归后序遍历利用了先序遍历的思想,由先序遍历的根左右,设想构造根右左输出结果的栈反向输出实现后序遍历的功能
//递归遍历
public static void postOrder1(Node root){
if (root == null)return;
preOrder1(root.left);
preOrder1(root.right);
System.out.print(root.value);
}
//栈遍历
private static void postOrder1(Node root){
if (root == null)return;
Stack<Node> stack = new Stack<>();
Stack<Node> stack2 = new Stack<>();
stack.push(root);
while (!stack.isEmpty()){
Node node = stack.pop();
stack2.push(node);
if(node.left != null)stack.push(node.left);
if(node.right != null)stack.push(node.right);
}
while (!stack2.isEmpty()){
System.out.print(stack2.pop().value);
}
}