JS算法-二叉树的后序遍历

143 阅读2分钟

题目

给你一棵二叉树的根节点 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);
		}
	}

坚持努力,无惧未来!