标记法实现二叉树的迭代遍历

    核心思想如下

    1. 使用颜色标记节点的状态 新节点标记为白色 已访问的节点标记为灰色
    2. 如果遇到白色的节点 就把它置灰 然后将其右节点 自身 左节点依次入栈
    3. 如果遇到灰节点 直接输出
    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @return {number[]}
    12. */
    13. var inorderTraversal = function(root) {
    14. var WHITE = 0, GRAY = 1
    15. var res = []
    16. var stack = [[WHITE,root]]
    17. while(stack.length > 0 ){
    18. const [color,node] = stack.pop()
    19. if(!node) continue
    20. if(color === WHITE){
    21. stack.push([WHITE,node.right])
    22. stack.push([GRAY,node])
    23. stack.push([WHITE,node.left])
    24. }else{
    25. res.push(node.val)
    26. }
    27. }
    28. return res
    29. };