题目
给你一棵二叉树的根节点 root
,返回其节点值的 后序遍历 。
输入: root = [1,null,2,3] 输出: [3,2,1]
题解
第一种
首先我们设定一个结果数组result用来保存后序遍历的结果。如果输入的二叉树为空,直接返回结果数组result,其次,创建两个栈s1和s2。s1用来存储待访问的节点,s2用来存储已访问的节点(即后序遍历的结果)将根节点root压入栈s1中。然后,当s1不为空的时候进行循环,每次弹出栈顶节点node并将其压入栈s2中,同时,将node的左右子节点压入栈s1中,以便下一次访问,最后,当s2不为空时,依次弹出栈顶节点node并将其值保存到结果数组result中。
var postorderTraversal = function (root) { let result = [] if (root == null) { return result } let s1 = [] let s2 = [] s1.push(root) while (s1.length !== 0) { let node = s1.pop() s2.push(node) if (node.left !== null) { s1.push(node.left) } if (node.right !== null) { s1.push(node.right) } } while (s2.length !== 0) { let node = s2.pop() result.push(node.val) } return result };
第二种
定义一个空数组 targetArr,用于存放遍历结果。定义一个递归函数 getTargetNum,用于递归遍历整棵树,并将结果存入 targetArr。在 getTargetNum 函数中,首先判断当前节点 rootNode 是否为空,若为空则直接返回 null。 接着判断当前节点 rootNode 的左子树是否为空,如果不为空则递归遍历左子树,如果右子树为空,则将当前节点的值加入 targetArr。若当前节点 rootNode 的右子树不为空,则递归遍历右子树,将当前节点的值加入 targetArr。最后判断当前节点 rootNode 是否为叶子节点(左右子树均为空),如果是,则将当前节点的值加入 targetArr。最终返回 targetArr,即为后序遍历结果。
var postorderTraversal = function(root) { let targetArr = []; var getTargetNum = function(rootNode){ if(rootNode == null) return null; let leftF = rootNode.left; let rightF = rootNode.right; if(leftF){ getTargetNum(leftF); if(rightF==null)targetArr.push(rootNode.val); } if(rightF){ getTargetNum(rightF); targetArr.push(rootNode.val); } if(leftF==null && rightF==null){ targetArr.push(rootNode.val); } }