zoukankan      html  css  js  c++  java
  • 0145-leetcode算法实现之二叉树的后续遍历-binary-tree-postorder-traversal-python&golang实现

    给定一个二叉树,返回它的 后序 遍历。

    示例:

    输入: [1,null,2,3]  
       1
        
         2
        /
       3 
    

    输出: [3,2,1]
    进阶: 递归算法很简单,你可以通过迭代算法完成吗?

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal

    python

    # 0145.二叉树后序遍历
    # 递归 & 迭代
    
    class Solution:
        def postOrderRecur(self, head: TreeNode) -> [int]:
            """
            递归, 左右根,LRN
            :param head:
            :return:
            """
            def traversal(head):
                if head == None:
                    return
                traversal(head.left)
                traversal(head.right)
                print(head.val + " ")
                res.append(head.val)
            res = []
            traversal(head)
            return res
    
        def postOrderItration(self, head: TreeNode):
            """
            迭代, 左右根, LRN
            stack入栈顺序: N L R 中左右
            res添加顺序:N R L 中右左, 反转后:左右中
            :param head:
            :return:
            """
            if head == None:
                return
            stack = [head]
            res = []
            while stack:
                node = stack.pop()
                # 先处理中节点
                res.append(node.val)
                # 左孩子先入栈
                if node.left:
                    stack.append(node.left)
                # 右孩子后入栈
                if node.right:
                    stack.append(node.right)
            # 返回前将res反转
            return res[::-1]
    

    goalng

    package main
    
    import "container/list"
    
    // 二叉树的后序遍历 -> 递归 && 迭代
    // 递归遍历
    func PostOrderTraversal(root *TreeNode) []int {
    	// 递归遍历, LRN, 左右根
    	var res = []int{}
    	var postorder func(node *TreeNode)
    	postorder = func(node *TreeNode) {
    		if node == nil {
    			return
    		}
    		postorder(node.Left)
    		postorder(node.Right)
    		res = append(res, node.Val)
    	}
    	postorder(root)
    	return res
    }
    
    // 迭代遍历 LRN 左右中
    // 压栈顺序:中右左(前序思路) 然后反转结果数组
    func PostOrder(root *TreeNode) []int {
    	if root == nil {
    		return nil
    	}
    	var stack = list.New()
    	stack.PushBack(root.Left)
    	stack.PushBack(root.Right)
    	var res = []int{}
    	res = append(res, root.Val)
    
    	for stack.Len() > 0 {
    		e := stack.Back()
    		stack.Remove(e)
    		node := e.Value.(*TreeNode) // e为Element type,值为Value,因Value为接口,需要断言
    		if node == nil {
    			continue
    		}
    
    		res = append(res, node.Val)
    		stack.PushBack(node.Left)
    		stack.PushBack(node.Right)
    	}
    	// 反转结果数组
    	for i := 0; i < len(res)/2; i++ {
    		res[i], res[len(res)-1-i] = res[len(res)-1-i], res[i]
    	}
    	return res
    }
    
    
  • 相关阅读:
    转载【Ubuntu】Ubuntu14.04虚拟机调整窗口大小自适应VMware14窗口
    【ubuntu】安装输入法
    【虚拟机ubuntu】安装之后安装VMware tools
    【虚拟机ubuntu设置ssh】ssh连不上问题解决方法
    JavaScript常用函数
    Label自适应高度
    xcode 删除文件后编译会出现*** is missing from working copy
    找window的三种方法
    怎么查看Mac电脑的开机记录?
    iOS 跳转到系统的设置界面
  • 原文地址:https://www.cnblogs.com/davis12/p/15542345.html
Copyright © 2011-2022 走看看