非递归我们就要借用栈先进后出的特性解决这个问题。
当传入节点不为空时,我们可以把当前节点放入栈中,并打印,之后让其左孩子进入栈,直到将所有左孩子放入栈中并打印,然后再将其栈顶元素抛出,让后将当前节点变为抛出节点的右孩子,放入栈中打印。这样就实现了非递归的二叉树的前序遍历。
void binaryTreePrev(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
TreeNode top =null;
while(cur!=null || !stack.empty()) {
while (cur != null) {
stack.push(cur);
System.out.print(cur.value + " ");
cur = cur.left;
}
top = stack.pop();
cur = top.right;
}
}
非递归的中序遍历即再前序遍历的基础上,先把栈顶元素抛出再打印,再让其有孩子入栈。
void binartTreeIN(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
TreeNode top = null;
while(cur!=null || !stack.empty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
top = stack.pop();
System.out.print(top.value + " ");
cur = top.right;
}
}