二叉树的遍历除了递归算法外还有迭代算法,采用具有后进先出特点的栈来实现。
前序遍历:根 左 右
public static void preOrder(TreeNode root) {
if(root != null) {
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.add(root);//入栈
while( !stack.isEmpty()) {
root = stack.pop();//出栈
if(root != null) {
System.out.println(root.val);
stack.push(root.right);
stack.push(root.left);
}
}
}
}
中序遍历:左 根 右
public static void midOrder(TreeNode root) {
if(root != null) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while( !stack.isEmpty() || root != null) {
if(root != null) {
stack.push(root);//入栈
root = root.left;
}else {
root = stack.pop();//出栈
System.out.println(root.val);
stack.push(root.right);
}
}
}
}
后序遍历:左 右 根
public static void behOrder(TreeNode root) {
if(root != null) {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode prev = null;
while( !stack.isEmpty() || root != null) {
while(root != null) {
stack.push(root);//入栈
root = root.left;
}
root = stack.pop();//出栈
if(root.right == null || root.right == prev) {
System.out.println(root.val);
prev = root;
root = null;}
else {
stack.push(root);
root = root.right;
}
}
}
}
对比递归算法的代码可知,二叉树的遍历还是递归算法比较简便。
参考视频链接:https://b23.tv/sgQNMI