Binary Tree Inorder Traversal
遍历顺序为左、根、右
如果根节点非空,将根节点加入到栈中。
如果栈不空,取栈顶元素(暂时不弹出),
如果左子树已访问过,或者左子树为空,则弹出栈顶节点,将其值加入数组,如有右子树,将右子节点加入栈中。
如果左子树不为空,则将左子节点加入栈中。
重复第二步,直到栈空。
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) return res;
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
res.add(cur.val);
cur = cur.right;
}
return res;
}更通用的解法
如果带有parent指针,另外加一个getSuccessor(),然后把 root 放到二叉树最左面为起点依次调用
getSuccessor() 流程,其实有点像 morris - traversal:
如果 cur 右子树不为空,返回右子树里面最左面的点(也即 cur.right 一路向左最远的点)
否则一路沿着(右child - parent) 的路线往上走,然后返回 parent 就行了
迭代器版本
Last updated