1. 程式人生 > 其它 >小白的LeetCode日記記錄Day4

小白的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];
    }
}