1. 前序遍历
前序遍历:中左右,首先弹出结点加入结果集,然后先将右孩子入栈,再将左孩子入栈,这样弹出栈的就会先是左孩子
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if(root==null) return res;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
res.add(node.val);
if(node.right != null){
stack.push(node.right);
}
if(node.left != null){
stack.push(node.left);
}
}
return res;
}
}
2.中序遍历
中序遍历:左中右,一直往左找到最低层结点,沿途的都压入栈中现在还不能弹出。找完之后弹出,找到【中】加入结果集,再向【中】右孩子迭代查找。
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if(root==null) return res;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
while(node != null || !stack.isEmpty()){
while(node!= null){
stack.push(node);
node = node.left;
}
node = stack.pop();
res.add(node.val);
node = node.right;
}
return res;
}
}
3.后序遍历
后序遍历:左右中
用pre记录当前右孩子是否已经遍历完毕可以输出【中】了,若已经遍历完迭代就可以继续往上了
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root == null){
return result;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
TreeNode node = root;
while( node!=null || !stack.isEmpty()){
while(node != null){
// System.out.print("压入"+node.val);
stack.push(node);
node = node.left;
}
node = stack.pop();
// System.out.println("弹出"+node.val);
if(node.right == null || node.right == pre){
//没有右孩子不需要继续迭代,或者当前右孩子是已经遍历完毕的
result.add(node.val);
// System.out.print("添加结果"+node.val);
//指向弹出的值
pre = node;
node = null;
}else{
//需要继续迭代不加入结果集
stack.push(node);
// System.out.println("重新压入"+node.val);
node = node.right;
}
}
return result;
}
}
文章详细介绍了二叉树的前序、中序和后序遍历方法,通过栈实现递归过程,分别展示了如何在遍历过程中添加节点值到结果集。
110

被折叠的 条评论
为什么被折叠?



