题目
给你一棵二叉树的根节点
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);
}
}
坚持努力,无惧未来!