美文网首页数据结构与算法
iOS实现反转二叉树

iOS实现反转二叉树

作者: Tioks | 来源:发表于2018-08-20 14:16 被阅读0次

    前言

    Max Howell大家可能都知道,他是著名的HomeBrew的作者,却在面试谷歌时由于不会写反转二叉树被谷歌拒绝.所以笔者抱着学习的态度在LeetCode上找到了Max Howell那道很有名的反转二叉树题目,比较简单适合刚接触算法的开发者们,所以笔者用OC和Swift分别进行了实现.原题地址

    题目:

    Input:

          4
        /   \
       2     7
      / \   / \
     1   3 6   9
    

    Output:

          4
        /   \
       7     2
      / \   / \
     9   6 3   1
    

    首先分析下这个二叉树,从上往下看发现这个树是把树上的数据进行了交换,但是仔细一看发现最后一排的1-3反转过去后变成了3-1.所以得出结论,这道题是左右子树进行了交换,用函数递归就能很容易实现了.

    知道了如何实现,直接看代码:

    OC版本

    声明节点属性

    @interface TreeNode : NSObject
    @property (nonatomic, assign) NSInteger val;
    @property (nonatomic, strong) TreeNode *left;
    @property (nonatomic, strong) TreeNode *right;
    @end
    

    实现代码:

    - (void)exchangeNode:(TreeNode *)node {
        
        //判断是否存在node节点
        if(node) {
            //交换左右节点
            TreeNode *temp = node.left;
            node.left = node.right;
            node.right = temp;
        }
    
    }
    
    - (TreeNode *)invertTree:(TreeNode *)root
    {
        //边界条件 递归结束或输入为空情况
        if(!root) {
           return root;
        }
    
        //递归左右子树
        [self invertTree:root.left];
        [self invertTree:root.right];
        //交换左右子节点
        [self exchangeNode:root];
    
        return root;
    }
    
    OC运行结果

    Swift版本

    节点

    public class TreeNode {
       public var val: Int
       public var left: TreeNode?
       public var right: TreeNode?
       public init(_ val: Int) {
           self.val = val
           self.left = nil
           self.right = nil
      }
    }
    

    实现代码:

    func invertTree(_ root: TreeNode?) -> TreeNode? {
        
        guard let root = root else {
            return nil
        }
        invertTree(root.left)
        invertTree(root.right)
        exchangeNode(root)
        
        return root; 
    }
    
    func exchangeNode(_ node: TreeNode?)  {
        
        if node != nil {
            let tmp = node?.left
            node?.left = node?.right
            node?.right = tmp
        }
    }
    
    Swift运行结果

    总结

    反转二叉树的题目也是算法中比较基础的题目,笔者在这里只是通过递归的方法进行实现,其他的方法大家可以自己研究下,欢迎讨论.另外笔者认为算法可能不会在实际开发中真正用到,但是却能锻炼开发者的思维能力,能更好的去分析解决问题,这也是为什么现在许多大公司都喜欢考算法题的原因吧.

    相关文章

      网友评论

        本文标题:iOS实现反转二叉树

        本文链接:https://www.haomeiwen.com/subject/xjqzbftx.html