1. 程式人生 > >LeetCode刷題EASY篇Invert Binary Tree

LeetCode刷題EASY篇Invert Binary Tree

題目

Invert a binary tree.

Example:

Input:

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

Output:

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

Trivia:
This problem was inspired by this original tweet by Max Howell:

十分鐘嘗試

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        Stack<TreeNode> stack=new Stack();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode currNode=stack.pop();
            //交換左右節點,錯了不是交換左右,如果四個節點呢?
            if(currNode.left!=null&&currNode.right!=null){
               int tmp=currNode.left.val;
               currNode.left.val=currNode.right.val;
               currNode.right.val=tmp; 
            }
            if(currNode.right!=null){
                stack.push(currNode.right);
            }
            if(currNode.left!=null){
                stack.push(currNode.left);
            }
            
        }
        return root;
        
        
    }
}

程式碼有問題,不是僅僅交換左右節點。如果四個節點,對應都需要交換。我只考慮兩個節點的情況。看了答案,原來不應該交換value,應該交換指標。測試通過,效率很高。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null) return null;
        Stack<TreeNode> stack=new Stack();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode currNode=stack.pop();
            //交換左右節點,錯了不是交換左右,如果四個節點呢?交換指標就可以
           TreeNode tmp=currNode.left;
           currNode.left=currNode.right;
           currNode.right=tmp; 
            if(currNode.right!=null){
                stack.push(currNode.right);
            }
            if(currNode.left!=null){
                stack.push(currNode.left);
            }
            
        }
        return root;
        
        
    }
}

stack先push左還是右其實應該沒有關係,測試一下,的確沒有問題。

可以看出來其實我們運用的是DFS,如何用BDF可以嗎?當然可以,再來,寫一下廣度優先遍歷解決這個問題。

一次搞定,待會看看其他人的思路,我的程式碼如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null) return null;
        Deque<TreeNode> queue=new LinkedList();
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode currNode=queue.poll();
            //交換左右節點,錯了不是交換左右,如果四個節點呢?交換指標就可以
           TreeNode tmp=currNode.left;
           currNode.left=currNode.right;
           currNode.right=tmp; 
            if(currNode.left!=null){
                queue.addLast(currNode.left);
            }
            if(currNode.right!=null){
                queue.addLast(currNode.right);
            }
            
        }
        return root;
        
        
    }
}