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
        }
    }
  • 相关阅读:
    Calendar类的应用
    使用Date和SimpleDateFormat类表示时间
    java中基本类型和字符串类型的转换
    java中的包装类
    java中的字符
    List的增删改插
    异常总结
    java中的异常链
    java中的异常抛出以及自定义异常
    spring mvc异常统一处理常见的有3种方式:
  • 原文地址:https://www.cnblogs.com/huangzs/p/14023635.html
Copyright © 2011-2022 走看看