力扣算法 - 翻转二叉树

180 阅读1分钟

翻转二叉树

翻转一棵二叉树。

示例:

输入:

    4
   /   \
  2     7
 / \   / \
1   3 6   9
输出:
    4
   /   \
  7     2
 / \   / \
9   6 3   1

思路:
1. 遍历二叉树中每个元素 (遍历方法: 前序、后序、中序、层级遍历)
2.遍历拿到的元素 将元素的左子树 和 右子树 替换 
Java实现
public class _226_翻转二叉树 {

    /**
     * 层序遍历方法
     */
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return root;

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            TreeNode temp = node.left;
            node.left = node.right;
            node.right = temp;

            if (node.left != null) {
                queue.offer(node.left);
            }

            if (node.right != null) {
                queue.offer(node.right);
            }

        }

        return root;
    }

    /**
     * 中序遍历方法
     */
    public TreeNode invertTree3(TreeNode root) {
        if (root == null) return root;

        invertTree(root.right);
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        // root.right right  left 和 right的值已经被调换过了
        invertTree(root.right);

        return root;
    }

    /**
     * 后序遍历方法
     */
    public TreeNode invertTree2(TreeNode root) {
        if (root == null) return root;

        invertTree(root.left);
        invertTree(root.right);
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;

        return root;
    }

    /**
     * 前序遍历方法
     */
    public TreeNode invertTree1(TreeNode root) {
        if (root == null) return root;

        invertTree(root.left);
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        // root.left 用left原因是  left 和 right的值已经被调换过了
        invertTree(root.left);

        return root;
    }

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }
}
Swift实现
    func invertTree(_ root: TreeNode?) -> TreeNode? {
        
        if root == nil { return root }
        
        var queue = [TreeNode]();
        queue.append(root!);
        while !queue.isEmpty {
            let node = queue.popLast()
            
            let temp = node?.left
            node?.left = node?.right
            node?.right = temp
            
            if node?.left != nil {
                queue.append((node?.left)!)
            }
            if node?.right != nil {
                queue.append((node?.right)!)
            }
        }
        return root
    }


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