LeetCode.965-單一二叉樹(Univalued Binary Tree)

這是悅樂書的第366次更新,第394篇原創

java

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第228題(順位題號是965)。若是樹中的每一個節點具備相同的值,則二叉樹是單一的。當且僅當給定樹是單一時才返回truenode

1
   / \   
  1   1
 / \   \
1   1   1

輸入: [1,1,1,1,1,null,1]
輸出: true算法

2
   / \   
  2   2
 / \   
5   2

輸入: [2,2,2,5,2]
輸出: false數據結構

注意code

  • 給定樹中的節點數量將在[1,100]範圍內。遞歸

  • 每一個節點的值將是[0,99]範圍內的整數。

    class

02 第一種解法

題目的意思是判斷二叉樹中的節點值是否都是一個值,爲同一個值就返回true,不是就返回false基礎

思路:使用遞歸,中序遍歷二叉樹的每一個節點,存入List中,再遍歷比較List中的元素是否都等於二叉樹的根節點值。數據結構與算法

public boolean isUnivalTree(TreeNode root) {
    List<Integer> list = new ArrayList<Integer>();
    helper(root, list);
    for (Integer num : list) {
        if (num != root.val) {
            return false;
        }
    }
    return true;
}

public void helper(TreeNode root, List<Integer> list) {
    if (root == null) {
        return ;
    }
    helper(root.left, list);
    list.add(root.val);
    helper(root.right, list);
}


03 第二種解法

針對第一種解法的遞歸方式,咱們也能夠換成迭代的方式,藉助棧Stack來實現。List

public boolean isUnivalTree2(TreeNode root) {
    List<Integer> list = new ArrayList<Integer>();
    Stack<TreeNode> stack = new Stack<TreeNode>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        list.add(node.val);
        if (node.left != null) {
            stack.push(node.left);
        }
        if (node.right != null) {
            stack.push(node.right);
        }
    }
    for (Integer num : list) {
        if (num != root.val) {
            return false;
        }
    }
    return true;
}


04 第三種解法

在第二種解法的基礎上,咱們能夠直接判斷出棧的樹的節點值是否等於根節點值,省掉存入List的步驟。

public boolean isUnivalTree3(TreeNode root) {
    Stack<TreeNode> stack = new Stack<TreeNode>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        if (node.val != root.val) {
            return false;
        }
        if (node.left != null) {
            stack.push(node.left);
        }
        if (node.right != null) {
            stack.push(node.right);
        }
    }
    return true;
}


05 第四種解法

既然判斷節點值是否都是同一個值,那麼能夠藉助HashSet去重的特性,使用遞歸,中序遍歷節點值,存入HashSet中,最後判斷HashSetsize是否等於1便可。

public boolean isUnivalTree4(TreeNode root) {
    Set<Integer> set = new HashSet<Integer>();
    helper(root, set);
    return set.size() == 1;
}

public void helper(TreeNode root, Set<Integer> set) {
    if (root == null) {
        return ;
    }
    helper(root.left, set);
    set.add(root.val);
    helper(root.right, set);
}


06 第五種解法

針對第四種解法,也能夠經過迭代的方式的來實現,藉助棧Stack

public boolean isUnivalTree5(TreeNode root) {
    Set<Integer> set = new HashSet<Integer>();
    Stack<TreeNode> stack = new Stack<TreeNode>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        set.add(node.val);
        if (node.left != null) {
            stack.push(node.left);
        }
        if (node.right != null) {
            stack.push(node.right);
        }
    }
    return set.size() == 1;
}


07 第六種解法

咱們也能夠直接用遞歸,不借助其餘的類。

public boolean isUnivalTree6(TreeNode root) {
    return help(root, root.val);            
}

public boolean help(TreeNode root, int num){
    if (root != null && root.left == null 
            && root.right == null && root.val == num) {
        return true;
    }
    if (root != null && root.left == null) {
        return root.val == num && help(root.right, num);
    }  
    if (root != null && root.right == null) {
        return root.val == num && help(root.left, num);
    }
    return root != null && root.val == num 
            && help(root.right, num) && help(root.left, num);
}


08 第七種解法

針對上面的第六種解法,咱們還能夠再簡化下。由於題目給了二叉樹節點的數量範圍,root是不會爲空的,等於null表示當前沒有繼續能夠向下遍歷的節點了。

public boolean isUnivalTree7(TreeNode root) {
    return helper(root, root.val);            
}

public boolean helper(TreeNode root, int num){
    if (root == null) {
        return true;
    }
    if (root.val != num) {
        return false;
    }
    return helper(root.right, num) && helper(root.left, num);
}


09 小結

算法專題目前已連續日更超過七個月,算法題文章234+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索