二叉树的前中后遍历方式(递归+迭代)

参考:https://blog.csdn.net/xiaoxiaxiaen/article/details/74745747

1.前序遍历:

递归版:

public void preOrder(TreeNode root){
		if(root==null) return;
		System.out.print(root.val+" ");
		preOrder(root.left);
		preOrder(root.right);
	}

迭代版:

//非递归版(根节点先不入栈)
	public void preOrder2(TreeNode root){
		if(root==null) return;
		Stack<TreeNode> s=new Stack<>();
		while(root!=null||!s.isEmpty()){
			while(root!=null){
				System.out.print(root.val+" ");
				s.push(root);
				root=root.left;
			}
			if(!s.isEmpty()){
				root=s.pop();
				root=root.right;
			}
		}
	}
//非递归版(根节点先入栈)
	public void preOrder3(TreeNode root){
		if(root==null) return;
		Stack<TreeNode> s=new Stack<>();
		s.push(root);
		while(!s.isEmpty()){
			TreeNode node=s.pop();
			System.out.print(node.val+" ");
			if(node.right!=null){
				s.push(node.right);
			}
			if(node.left!=null){
				s.push(node.left);
			}
		}
	}

2.中序遍历

递归:

public void inOrder(TreeNode root){
		if(root==null) return;
		inOrder(root.left);
		System.out.print(root.val+" ");
		inOrder(root.right);
	}

迭代:

public void inOrder2(TreeNode root){
		if(root==null) return;
		Stack<TreeNode> s=new Stack<>();
		while(root!=null||!s.isEmpty()){
			while(root!=null){
				s.push(root);
				root=root.left;
			}
			if(!s.isEmpty()){
				root=s.pop();
				System.out.print(root.val+" ");
				root=root.right;
			}
		}
	}

3.后序遍历

递归:

public void backOrder(TreeNode root){
		if(root==null) return;
		backOrder(root.left);
		backOrder(root.right);
		System.out.print(root.val+" ");
	}

迭代:

public void backOrder2(TreeNode root){
		if(root==null) return;
		Stack<TreeNode> s=new Stack<>();
		Stack<TreeNode> temp=new Stack<>();
		while(root!=null||!s.isEmpty()){
			while(root!=null){
				temp.push(root);
				s.push(root);
				root=root.right;
			}
			if(!s.isEmpty()){
				root=s.pop();
				root=root.left;
			}
		}
		while(!temp.isEmpty()){
			System.out.print(temp.pop().val+" ");
		}
	}

猜你喜欢

转载自blog.csdn.net/orangefly0214/article/details/88921831