小白的LeetCode日記記錄Day4
技術標籤:資料結構與演算法
16.二叉樹的映象
請完成一個函式,輸入一個二叉樹,該函式輸出它的映象。
解法:利用棧來解決。首先判斷根節點是否為空(為空直接返回空)然後建立一個棧把根節點先放進去。當棧不為空時,彈出節點然後將它的左節點和右節點放入棧中,之後交換左右節點,這樣當第二次迴圈時,會先彈出右節點並且交換他的左右子節點,之後彈出左節點交換它的左右子節點。重複該過程直到沒有節點。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root==null) return null;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
if(node.left!=null) stack.push(node.left);
if(node.right!=null) stack.push(node.right);
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
}
return root;
}
}
17.判斷對稱的二叉樹
請實現一個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
1
/ \
2 2
/ \ / \
3443
但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:
1
/\
2 2
\ \
3 3
解法:利用遞迴。先判斷根節點,如果為空返回空。否則把左右節點帶入judge()方法。該方法的終止條件為判斷左右節點。若都為空返回true,如果左節點為空或者右節點為空或者左右節點值不相等返回false,然後返回judge(左節點右子節點,右節點左子節點)&&(右節點左子節點,左節點右子節點)。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
return judge(root.left,root.right);
}
private boolean judge (TreeNode L,TreeNode R){
if(L==null&&R==null) return true;
if(L==null||R==null||L.val!=R.val) return false;
return judge(L.right,R.left)&&judge(R.right,L.left);
}
}
18.兩數之和
給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
解法一:暴力法,雙重迴圈遍歷陣列中的元素,滿足條件就建立一個新數字返回這兩個數
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 0;i<nums.length;i++){
for(int j =i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target)
return new int[]{i,j};
}
}
return new int[0];
}
}
解法二:雜湊表。利用雜湊表key值不可重複的特點,遍歷陣列,先判斷map中有沒有符合target-num[i]的鍵,如果有的話建立一個新陣列返回這個target-nums[i]的鍵和i,沒有的話就把num[i]和i放到map中。最終迴圈後沒有找到就創造一個新陣列把0放進去。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; ++i) {
if (hashtable.containsKey(target - nums[i])) {
return new int[]{hashtable.get(target - nums[i]), i};
}
hashtable.put(nums[i], i);
}
return new int[0];
}
}