中序遍历
我们可以借助一个栈来辅助实现
首先一直向左走走到底
if(cur != null){
stack.push(cur)
cur = cur.left;
}
此时栈中
因为是中序遍历,此时结点的值为null,所以去当前结点的父节点的值,即当前二叉树的最左结点的值。
cur = stack.pop();
res = cur.val;
//去试探右孩子结点
cur = cur.right;
此时是这种情况
当前节点的值已经记录到了res数组中,我们需要去找他的右孩子结点,
此时右孩子为空,我们需要向上走,再一次出栈
指针来到2处,重复上述操作,便完成了非递归的中序遍历
####代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
if(cur != null){
stack.push(cur);
cur = cur.left;
}else{
cur = stack.pop();
res.add(cur.val);
cur = cur.right;
}
}
return res;
}}
先序遍历
先序遍历只需要改变一下取值的次序即可
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List <Integer> nums = new ArrayList<Integer>();
Stack <TreeNode> stack = new Stack<>();
TreeNode cur = root;
if(root == null){
return nums;
}
while( !stack.isEmpty() || cur != null){
if(cur != null){
nums.add(cur.val);
stack.push(cur);
cur = cur.left;
}else{
cur = stack.pop();
cur = cur.right;
}
}
return nums;
}
}
后序遍历
后序遍历我们需要加一个辅助指针prev来记录上一个遍历的结点。
假设到此位置时,我们取4结点的值,即出栈后取值,根据后序遍历的思想,我们需要到5结点的位置,此时我们需要让2出栈,然后取2的右孩子,取到值后再让2进栈,然后再让2出栈取2的值。
我们可以看到2节点出栈入栈了多次,所以需要prev来记录上一个遍历的结点,如到取2结点的值时,
通过prev指针我们可以知道,2结点的右孩子已经被遍历过了,所以我们直接取2结点的值。
代码实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List <Integer> nums = new ArrayList<Integer>();
Stack <TreeNode> stack = new Stack<>();
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){
nums.add(root.val);
prev = root;
root = null;
}else{
stack.push(root);
root = root.right;
}
}
return nums;
}
}