Swift -请设计一个可以展示一棵二叉树的App

demo下载地址

首先一个简单的App是MVC架构的,所以就要在View 的界面上表示一棵二叉树,一般人的脑海中浮现的树的结构如图

在这里插入图片描述

所以是不是的在View 的界面上,每个节点放一个UILable 来表示,然后用数学方法计算每个UILable 对应的位置,

  • 每个UILable 的位置计算起来比较麻烦
  • 如果一棵树有很多个节点,那么当前界面就会展示不下,这个时候怎么办?就算用UIScrollView 来处理,整棵树也会变得非常不直观。每个节点对应的UILable的位置计算起来就会更费劲。

要处理大量的数据,一般人就会想到UITableView.假如每一个cell对应一个节点,以及其左右

  1. 无需计算位置,UILableView 提供复用cell 效率大幅度提高
  2. 面对很多节点的问题,可以先处理一部分数据,然后用处理 infinite scroll 的方式来加载剩余数据。

代码

 func  p_levelOrder(root:TreeNode?) -> [[Int]] {
        var res = [[Int]]()
        //用数组来实现队列
        var queue = [TreeNode]()
        
        if let root = root {
            queue.append(root)
        }
        
        while queue.count > 0 {
            let size = queue.count
            var level = [Int]()
            
            for _ in 0..<size {
                
                let node = queue.removeFirst()
                
                level.append(node.val)
                
                if let left = node.left {
                    queue.append(left)
                }
                
                if let right = node.right {
                    queue.append(right)
                }
            }
            
            res.append(level)
            
        }
        return res
    }

测试

 @objc func levelOrder()
    {
       //给定二叉树 [1, 2, 3, 4, 5, 6,7,8]
       
        let root = TreeNode.init(val: 1)
        root.left = TreeNode.init(val: 2)
        root.right = TreeNode.init(val: 3)
        
        let second = root.left
        second?.left = TreeNode.init(val: 4)
        second?.right = TreeNode.init(val: 5)
        
        let thred =  second?.right
        thred?.left = TreeNode.init(val: 7)
        thred?.right = TreeNode.init(val: 8)
        
        let four = second?.left
        four?.left = TreeNode.init(val: 6)
        
    
        let result = self.p_levelOrder(root: root)
        print("设计一棵二叉树\(result)")
    }
    

结果

设计一棵二叉树[[1], [2, 3], [4, 5], [6, 7, 8]]

发布了128 篇原创文章 · 获赞 106 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/Z1591090/article/details/102660215