623-Add One Row to Tree

kevin聰發表於2018-05-03

Description

Given the root of a binary tree, then value v and depth d, you need to add a row of nodes with value v at the given depth d. The root node is at depth 1.

The adding rule is: given a positive integer depth d, for each NOT null tree nodes N in depth d-1, create two tree nodes with value v as N’s left subtree root and right subtree root. And N’s original left subtree should be the left subtree of the new left subtree root, its original right subtree should be the right subtree of the new right subtree root. If depth d is 1 that means there is no depth d-1 at all, then create a tree node with value v as the new root of the whole original tree, and the original tree is the new root’s left subtree.


Example 1:

Input: 
A binary tree as following:
       4
     /   \
    2     6
   / \   / 
  3   1 5   

v = 1

d = 2

Output: 
       4
      / \
     1   1
    /     \
   2       6
  / \     / 
 3   1   5   

Example 2:

Input: 
A binary tree as following:
      4
     /   
    2    
   / \   
  3   1    

v = 1

d = 3

Output: 
      4
     /   
    2
   / \    
  1   1
 /     \  
3       1

Note:

  1. The given d is in range [1, maximum depth of the given tree + 1].
  2. The given binary tree has at least one tree node.

問題描述

給定二叉樹的根節點, v和d, 你需要在高度為d的一行插入值為v的節點。根節點的高度為1

插入規則為:對於高度為d - 1的每個非空節點N,建立兩個節點, 分別作為N的左子樹的根節點以及右子樹的根節點。 N原來的左子樹的根節點為新的左子樹根節點的左孩子, N原來的右子樹的根節點為新的右子樹根節點的右孩子。如果d為1, 那麼新建一個根節點, 將原來的根節點作為新建根節點的左孩子。


問題分析

遞迴的過程中注意傳遞父節點, 然後注意高度, 當高度為1時插入新的根節點即可


解法

class Solution {
    public TreeNode addOneRow(TreeNode root, int v, int d) {
        if(d == 1){
            TreeNode row = new TreeNode(v);
            row.left = root;
            return row;
        }

        addOneRow(root, v, d, null);

        return root;
    }

    private void addOneRow(TreeNode root, int v, int d, TreeNode parent) {
        if(d == 1){
            if(parent != null){
                if(parent.left == root){
                    parent.left = new TreeNode(v);
                    parent.left.left = root;
                }else{
                    parent.right = new TreeNode(v);
                    parent.right.right = root;
                }
            }
            return;
        }
        if(root == null)    return;

        addOneRow(root.left, v, d - 1, root);
        addOneRow(root.right, v, d - 1, root);
    }
}

相關文章