• 【数据结构与算法】后续遍历的非递归实现


    回忆一下递归实现

    
    /**
    /**
     * Definition for a binary tree node.
     * function TreeNode(val, left, right) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.left = (left===undefined ? null : left)
     *     this.right = (right===undefined ? null : right)
     * }
     */
    /**
     * @param {TreeNode} root
     * @return {number[]}
     */
    
    */
    
    var postorderTraversal = function(root) {
    	var retArr = []
    	if (!root) return retArr
    	var helpFunc = (r)=>{
    		if (!r) return 
    		helpFunc(r.left)
    		helpFunc(r.right)
    		retArr.push(r.val)
    	}
    	helpFunc(root)
    	return retArr
    }
    
    

    用模拟栈来实现(方法一) 逆向

    
    var postorderTraversal = function(root) {
        if(!root) return []
        let cur = root
        var stack = []
        var retArr = []
        while(stack.length !== 0 || cur){
            // 右节点入栈
            if (cur) {
                stack.push(cur)
                retArr.push(cur.val)
                cur = cur.right
            }   else {
                var tmp = stack.pop()
                cur = tmp.left
            }
    
        }
        return retArr.reverse()
     }
    

    用模拟栈来实现(方法二 ) (单栈)

    
    var postorderTraversal = function(root) {
        if(!root) return []
        let cur = root
        var stack = []
        var retArr = []
        var r = null // 记录访问过的子节点
        while(stack.length !== 0 || cur){
            // 左节点入栈
            if (cur) {
                stack.push(cur)
                cur = cur.left
            }   else {
    
                cur = stack[stack.length - 1] // 读取栈顶元素,非弹出
                // 如果右子树存在,并且没有被访问
                if (cur.right && cur.right !=r) {
                    cur = cur.right
                } else {
                    // 弹出并访问
                    var tm = stack.pop()
                    retArr.push(tm.val)
                    r = cur
                    cur = null
                }
            }
    
        }
        return retArr
     }
    
    

    根左右 【前序】
    左根右 【中序】

    根右左 【后序–逆向】
    右根左 【中序–逆向】

  • 相关阅读:
    计算机网络(四)
    JS中的箭头函数
    每天一个设计模式之过滤器模式(Filter/Criteria Pattern)
    Java的String
    并发通信(网络进程线程)
    【JVM系列】- 类加载子系统与加载过程
    A. Morning Sandwich
    大模型助力企业数据驱动,火山引擎数智平台发布AI助手
    Linux中间件之redis存储原理和字典
    从408改考自主命题,211贵州大学考研改考
  • 原文地址:https://blog.csdn.net/a5534789/article/details/139391570