通过万岁!!!
- 题目:理解这个题之前,需要先了解另外一个题目。之前的题目大致意思是,给你一个数组,然后找数组中的最大值,然后最大值是一个节点,最大值左边的是其左子树,右边是右子树。然后构建起一个二叉树来即可。现在这个题目就是给你这个已经构建好的树,然后问,如果之前的数组在最右侧再加一个数val,那么他形成的二叉树应该是什么样子的。让你返回这个二叉树。
- 思路:首先,我们需要明确一个思路,就是这个一定在只看右子树即可,因为新加的这个数在最右侧。然后可以发现,其实就包含四种情况。第一种,val是最大的,那么val就是根节点,然后原来的树挂在右边即可。第二种:在往右边遍历的时候遇到了,也就是说,那么就额外加一个val对应的节点即可。第三种就是需要挂在最右侧的右子树。第四种就是挂在最右侧的左子树。
- 技巧:树与数组的转换
java代码
class Solution {
public TreeNode insertIntoMaxTree(TreeNode root, int val) {
// 他一定要挂在右子树上
if (val > root.val) {
TreeNode treeVal = new TreeNode(val);
treeVal.left = root;
return treeVal;
}
recursionRight(root, val);
return root;
}
private void recursionRight(TreeNode root, int val) {
// 中途找到了
if (root.right != null && root.right.val < val) {
TreeNode newTree = new TreeNode(val);
newTree.left = root.right;
root.right = newTree;
return;
}
// 找到了之前的最右侧
if (root.right == null) {
if (root.val > val) {
root.right = new TreeNode(val);
return;
} else {
// 替换val
int oldVal = root.val;// 之前
root.val = val;// 新节点过来
TreeNode oldTree = new TreeNode(oldVal);// 旧节点
oldTree.left = root.left;
oldTree.right = root.right;
root.left = oldTree;
}
return;
}
recursionRight(root.right, val);
}
}
- 总结:题目不是特别难,主要是首先明确一定是只找右子树即可。