Add One Row to Tree

来源:互联网 发布:三国志9最新优化伴侣 编辑:程序博客网 时间:2024/05/19 19:41

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 vas 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 = 1d = 2Output:        4      / \     1   1    /     \   2       6  / \     /  3   1   5   

Example 2:

Input: A binary tree as following:      4     /       2       / \     3   1    v = 1d = 3Output:       4     /       2   / \      1   1 /     \  3       1

Note:

  1. The given d is in range [1, maximum depth of the given tree + 1].

  1. The given binary tree has at least one tree node.


这里应该采用先序遍历比较好,如果当前层已经是目标层,那么就不要走它的孩子节点了。

注意在走到d - 1 层的时候,就需要对树进行调整。例如第二个例子,d = 3, 当走到2这个节点的时候,depth = 2, 也就是说要在他的下面插入两个目标节点,那么记录好当前节点2的左右孩子,然后保存到新的节点的左右孩子的对应方向就可以了。具体看代码把

代码:
/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {     private int targetDepath = -1;    private int value = -1;    public TreeNode addOneRow(TreeNode root, int v, int d) {        if(d < 0) return root;        if(d == 1) {            TreeNode newRoot = new TreeNode(v);            newRoot.left = root;            return newRoot;        }        targetDepath = d;        value = v;        preOrder(root, null, 1);        return root;    }    private void preOrder(TreeNode node, String direction, int layer) {        if(node == null) return;        if(layer + 1 == targetDepath) {            TreeNode leftNode = new TreeNode(value);            TreeNode rightNode = new TreeNode(value);            leftNode.left = node.left;            rightNode.right = node.right;            node.left = leftNode;            node.right = rightNode;                    } else  if(layer > targetDepath) return;        else {            preOrder(node.left, "L", layer + 1);            preOrder(node.right, "R", layer + 1);        }    }}


原创粉丝点击