1. 程式人生 > >日常演算法題(四)

日常演算法題(四)

1.二叉樹的最小深度

給定二叉樹,找到它的最小深度。

最小深度是沿從根節點到最近的葉節點的最短路徑上的節點數。

注意: 葉子是沒有子節點的節點。

例:

給定二叉樹[3,9,20,null,null,15,7], 返回其最小深度= 2。

想法:使用bfs直接遍歷,找到根和子葉節點最短路徑的節點數,且該子節點沒有左孩子節點也無右孩子節點

程式碼:

public int minDepth(TreeNode root) {
        if(root == null) return 0;
        List<TreeNode> list = new LinkedList<>();
        list.add(root);
        int level = 1;
        while(!list.isEmpty()){
            int len = list.size();
            for(int i = 0;i<len;i++){
                TreeNode node = list.remove(0);
                if(node.left == null && node.right == null) return level;
                if(node.left != null) list.add(node.left);
                if(node.right != null) list.add(node.right);
            }
            level++;
        }
        return 0;

2.向樹中新增一行:

給定二叉樹的根,然後是值v和深度d,您需要v在給定深度新增一行具有值的節點d。根節點位於深度1。

該新增規則是:給定一個正整數的深度d,對於每一個NOT NULL樹節點N的深度d-1,建立兩個樹節點以價值v為N’s左子樹的根和右子樹的根。和N’s 原來的左子樹應該是新的左子樹的根的左子樹,其原有的右子樹應該是新的右子樹的根的右子樹。如果depth d為1表示根本沒有深度d-1,則建立一個值為v的樹節點作為整個原始樹的新根,並且原始樹是新根的左子樹。 在這裡插入圖片描述

注意: 給定的d在範圍[1,給定樹的最大深度+ 1]。 給定的二叉樹至少有一個樹節點。