zoukankan      html  css  js  c++  java
  • LeetCode二叉树的前序遍历、中序遍历、后序遍历、层序遍历、最大深度Swift

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     public var val: Int
     *     public var left: TreeNode?
     *     public var right: TreeNode?
     *     public init() { self.val = 0; self.left = nil; self.right = nil; }
     *     public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
     *     public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
     *         self.val = val
     *         self.left = left
     *         self.right = right
     *     }
     * }
     */
    class Solution {
        var res:[Int] = []
        func preorderTraversal(_ root: TreeNode?) -> [Int] {
            if root == nil {return []}
            res.append(root!.val)
            preorderTraversal(root!.left)
            preorderTraversal(root!.right)  
            return res
        }
    }

    概念

    前序遍历:根节点-左子树-右子树

    class Solution {
        var res:[Int] = []
        func preorderTraversal(_ root: TreeNode?) -> [Int] {
            if root == nil {return []}
            res.append(root!.val)
            preorderTraversal(root!.left)
            preorderTraversal(root!.right)  
            return res
        }
    }

    中序遍历:左子树-根节点-右子树

    class Solution {
        var res:[Int] = []
        func inorderTraversal(_ root: TreeNode?) -> [Int] {
            if root == nil {return []}
            inorderTraversal(root!.left)
            res.append(root!.val)
            inorderTraversal(root!.right)  
            return res
        }
    }

    后序遍历:左子树-右子树-根节点

    class Solution {
        var res:[Int] = []
        func postorderTraversal(_ root: TreeNode?) -> [Int] {
            if root == nil {return []}
            postorderTraversal(root!.left)
            postorderTraversal(root!.right)  
            res.append(root!.val)
            return res
        }
    }

    层序遍历:一层一层遍历

    思路一:利用两个数组,遍历二叉树,先把根节点加进根节点数组中,把他的左右子结点加进下一级结点数组中。然后清空根节点数组,将下一级结点数组当做根节点数组,依次迭代。

    class Solution {
        
        func levelOrder(_ root: TreeNode?) -> [[Int]] {
            guard let root = root else { return [] }
            //最终结果数组
            var result:[[Int]] = []
            //根节点数组
            var rootArr:[TreeNode] = [root]
            //下一级节点数组
            var nextLevelArr:[TreeNode] = []
            while !rootArr.isEmpty {
                //存放根节点值得数组
                var tmpArr:[Int] = []
                for node in rootArr {
                    //把根节点数组里的值放进去临时数组
                    tmpArr.append(node.val)
                    if let node = node.left {
                        nextLevelArr.append(node)
                    }
                    if let node = node.right {
                        nextLevelArr.append(node)
                    }
                }
                //把临时数组放进最终结果数组
                result.append(tmpArr)
                rootArr.removeAll()
                rootArr=nextLevelArr
                nextLevelArr.removeAll()
            }
            return result
        }
    }

    思路二:利用队列先进先出的原理,遍历二叉树,先把父节点加进去,然后移除父节点,把他的左右子节点加进去。

    class Solution {
        func levelOrder(_ root: TreeNode?) -> [[Int]] {
            guard let root = root else { return [] }
            //最终结果数组
            var result:[[Int]] = []
            //根节点数组
            var queue:[TreeNode] = [root]
            while !queue.isEmpty {
                //存放根节点值得数组
                var tmpArr:[Int] = []
                for node in queue {
                    //把根节点数组里的值放进去临时数组
                    tmpArr.append(node.val)
                    queue.removeFirst()
                    if let node = node.left {
                        queue.append(node)
                    }
                    if let node = node.right {
                        queue.append(node)
                    }
                }
                //把临时数组放进最终结果数组
                result.append(tmpArr)
            }
            return result
        }
    }

    深度优先遍历:

    前序遍历:ABDECFG

    中序遍历:DBEAFCG

    后序遍历:DEBFGCA

    广度优先遍历:

    层序遍历:ABCDEFG

    二叉树的最大深度

    思路一:层序遍历总层数

    class Solution {
        func maxDepth(_ root: TreeNode?) -> Int {
            guard let root = root else { return 0 }
            //根节点数组
            var queue:[TreeNode] = [root]
            var depth = 0
            while !queue.isEmpty {
                for node in queue {
                    queue.removeFirst()
                    if let node = node.left {
                        queue.append(node)
                    }
                    if let node = node.right {
                        queue.append(node)
                    }
                }
                depth+=1
            }
            return depth
        }
    }

    思路二:二叉树的最大深度=Max(左子树的最大深度,右子树的最大深度)+1

    class Solution {
        func maxDepth(_ root: TreeNode?) -> Int {
            guard let root = root else { return 0 }return max(maxDepth(root.left), maxDepth(root.right)) + 1
        }
    }
  • 相关阅读:
    Input(Checkbox)全选删除
    DropDownList查询&Input(Checkbox)查询
    分页(二)
    webform---组合查询&流水号生成
    (转)C#生成中文汉字验证码源码(webform)
    文件上传
    [转]用C#如何实现大文件的断点上传
    DOM操作----open()
    经典背包问题的探讨
    贪心算法----正整数分解问题 和相同,乘积最大
  • 原文地址:https://www.cnblogs.com/huangzs/p/14023635.html
Copyright © 2011-2022 走看看