版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35508033/article/details/89041242
中序遍历非递归
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
//中序遍历非递归(左--根--右)
class Solution {
public void LDR(TreeNode node) {
Stack<TreeNode> stack = new Stack<>();
while(node!=null||!stack.isEmpty()){
if(node!=null){
//先将根节点加入到栈中,再依次将左子树的左节点全部加入到栈中
stack.push(node);
node=node.left;
}else{
node=stack.pop();//先取出左栈中的左节点的值和根节点的值,再放入右节点
System.out.println(node.val+" ");
node=node.right;
}
}
}
}
前序遍历非递归
public class TreeNode {//二叉树节点结构
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
//前序遍历非递归(根--左--右)
public static void DLR(TreeNode node){
if(node!=null){
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(node);
while(!stack.isEmpty()){
node = stack.pop();
System.out.print(node.val+" ");
if(node.right!=null)stack.push(node.right);//左节点放入栈中
if(node.left!=null)stack.push(node.left);//右节点放入栈中
}
}
}
层次遍历非递归
public static void levelOrder(TreeNode node){
Queue<TreeNode> queue=new LinkedBlockingDeque<TreeNode>();
queue.offer(node);//根节点入队
while(!queue.isEmpty()){
node=queue.poll();
System.out.print(node.val+" ");
if(node.left!=null){
queue.add(node.left);//存入左节点入队
}
if(node.right!=null){
queue.add(node.right);//存入右节点入队
}
}
}
后序遍历非递归
public static void LRD(TreeNode node){//使用两个栈进行处理,代码看上去简单易懂
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
stack1.push(node);//根节点入栈
TreeNode tempNode = null;
while(!stack1.isEmpty()){
tempNode = stack1.pop();
if (tempNode.left != null) {
stack1.push(tempNode.left);
}
if (tempNode.right != null) {
stack1.push(tempNode.right);
}
stack2.push(tempNode);
}
while (!stack2.isEmpty()) {
System.out.print(stack2.pop().val+" ");
}
}