iOS實現反轉二叉樹

Tioks0發表於2018-09-14

iOS實現反轉二叉樹

前言

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執行結果

總結

反轉二叉樹的題目也是演算法中比較基礎的題目,筆者在這裡只是通過遞迴的方法進行實現,其他的方法大家可以自己研究下,歡迎討論.另外筆者認為演算法可能不會在實際開發中真正用到,但是卻能鍛鍊開發者的思維能力,能更好的去分析解決問題,這也是為什麼現在許多大公司都喜歡考演算法題的原因吧.

相關文章