迭代法实现preOder遍历
前序遍历是中 左 右 ,如果还有左子树就一直找。结束之后返回从最底层逐步向右找。
public List<Integer> preOderTraversal(TreeNode root){
List<Integer> res = new ArrayList<Integer>();
if(root==null){
return res;
}
Deque<TreeNode>stack = new LinkedList<TreeNode>();
TreeNode node = root ;
while(!stack.isempty())||node!=null)
{
while(node!=null)
{
res.add(node.val);
stack.push(node);
node = node.left;
}
node = stack.pop();
node= node.right;
}
return res;
}
迭代法实现inOrder遍历
public List<Integer> inOderTraversal(TreeNode root)
{
List<Integer> res = new ArraryList<Integer>();
Deque<TreeNode> stack = new LinkedList<TreeNode>();
while(root!=null || !stack.isempty())
{
while(root!=null)
{
stack.push(root);
root = root.left;
}
root = stack.pop();
res.add(root.val);
root = root.right;
}
return res;
}
反转法实现postOrder遍历
后序遍历的非递归实现有三种基本思路:反转法、访问标记法、和Morris法。
访问标记法可能比较难以理解。而Morris法是一个老外发明的巧妙思想:不使用栈,而是用好树中的null指针,但是实现后序遍历任然非常麻烦。
这里介绍反转法。
也就是 中 右 左遍历 然后将结果集反转就行。
public List<Integer> postOrderTraversal (TreeNode root )
{
List<Integer> res = new ArrayList<Integer> ();
if(root==null) return res;
Stack<TreeNode>stack = new Stack<>();
TreeNode node = root;
while(!stack.isempty()||node!=null)
{
while(node!=null)
{
res.add(node.val);
stack.push(node);
node = node.right;
}
node = stack.pop();
node = node.left;
}
Collections.reverse(res);
return res;
}