LeetCode刷題EASY篇Invert Binary Tree
阿新 • • 發佈:2018-12-20
題目
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; } }