树的前序、中序、后序非递归遍历总结

来源:互联网 发布:淘宝法院拍卖网 编辑:程序博客网 时间:2024/06/01 09:00

参考自:这里

  • 前序遍历
/* * 当一个指针从栈中弹出来时,此树的左子树已经遍历完成。 * p如果不为空,表示当前需要遍历p所指向的树(这棵树还没有开始遍历)。 */public List<Integer> preorderTraversal(TreeNode root) {    List<Integer> result = new ArrayList<>();    Deque<TreeNode> stack = new ArrayDeque<>();    TreeNode p = root;    while(!stack.isEmpty() || p != null) {        if(p != null) {            stack.push(p);            result.add(p.val);  // Add before going to children            p = p.left;        } else {            TreeNode node = stack.pop();            p = node.right;           }    }    return result;}
  • 中序遍历
/* * 当一个指针从栈中弹出来时,此树的左子树已经遍历完成。 * p如果不为空,表示当前需要遍历p所指向的树(这棵树还没有开始遍历)。 */public List<Integer> inorderTraversal(TreeNode root) {    List<Integer> result = new ArrayList<>();    Deque<TreeNode> stack = new ArrayDeque<>();    TreeNode p = root;    while(!stack.isEmpty() || p != null) {        if(p != null) {            stack.push(p);            p = p.left;        } else {            TreeNode node = stack.pop();            result.add(node.val);  // Add after all left children            p = node.right;           }    }    return result;}
  • 后序遍历
/* * 后序遍历的反向结果是类似与先序遍历的形式:根->右子树->左子树 * 当一个指针从栈中弹出来时,此树的右子树已经遍历完成。 * p如果不为空,表示当前需要遍历p所指向的树(这棵树还没有开始遍历)。 */public List<Integer> postorderTraversal(TreeNode root) {    LinkedList<Integer> result = new LinkedList<>();    Deque<TreeNode> stack = new ArrayDeque<>();    TreeNode p = root;    while(!stack.isEmpty() || p != null) {        if(p != null) {            stack.push(p);            result.addFirst(p.val);  // Reverse the process of preorder            p = p.right;             // Reverse the process of preorder        } else {            TreeNode node = stack.pop();            p = node.left;           // Reverse the process of preorder        }    }    return result;}
1 0
原创粉丝点击