606. 根据二叉树创建字符串【简单题】【每日一题】
思路:【递归】
- 定义递归函数dfs,传入参数sb和root。
- dfs函数体:
将当前节点值添加到sb中,然后判断root是否存在左子节点,若存在,则sb添加左括号,递归左子节点,若不存在左子节点,则判断此时(即不存在左子节点时)是否存在右子节点,如果是,那么sb需要添加一个完整的括号,表示这个位置有一个左子节点缺失,如果不是,那么说明这个节点没有子节点,sb中添加一个右括号函数返回。判断root是否存在右子节点,如果存在,那么sb添加左括号,递归右子节点,如果不存在,那么sb添加右括号函数返回。 - 上述dfs函数在所有节点都遍历结束之后,在尾结点处要以sb添加一个右括号返回,因此整体的sb是多添加了一个右括号的,所以在函数返回的时候需要将最后一个哦右括号去掉。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public String tree2str(TreeNode root) {
StringBuilder sb = new StringBuilder();
dfs(sb,root);
return sb.substring(0,sb.length()-1);
}
public void dfs(StringBuilder sb,TreeNode root){
sb.append(root.val);
if(root.left != null){
sb.append("(");
dfs(sb,root.left);
}else if(root.right != null){
sb.append("()");
}
if(root.right != null){
sb.append("(");
dfs(sb,root.right);
}
sb.append(")");
}
}
98. 验证二叉搜索树【中等题】
思路:【中序遍历】
- 根据题目的规则,那么这个二叉树如果通过中序遍历将得到的值存起来,得到的列表一定是严格递增的。
- 我一开始想在中序遍历的同时就将出现大小没有严格递增的异常报出来,直接退出递归返回false,可怎么调都搞不出来,我是笨比。
- 最后将只能将这个列表弄出来,然后再遍历一遍列表,看看是不是从头到尾严格递增,如果不是则这接返回false,如果可以遍历结束,说明确实严格递增,那么就返回true。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
LinkedList<Long> list = new LinkedList<>();
dfs(list,root);
if (list.size() == 1){
return true;
}
long min = Long.MIN_VALUE;
for (Long integer : list) {
if (integer > min){
min = integer;
}else {
return false;
}
}
return true;
}
public void dfs(LinkedList<Long> list, TreeNode root){
if(root != null){
dfs(list,root.left);
list.addLast((long) root.val);
dfs(list,root.right);
}
}
}
99. 恢复二叉搜索树【中等题】
思路:
- 中序遍历所有的节点,将节点存入集合list。
- 遍历集合list中的节点值,找出非递增的那两个错误节点,a在前b在后(实际应为b在前a在后)。
- 交换节点a和b的节点值即可。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public void recoverTree(TreeNode root) {
List<TreeNode> list = new ArrayList<>();
dfs(list,root);
TreeNode a = null,b = null;
for (int i = 1; i < list.size(); i++) {
if (list.get(i).val < list.get(i-1).val){
b = list.get(i);
if(a == null){
a = list.get(i-1);
}
}
}
if (a != null && b != null){
int temp = a.val;
a.val = b.val;
b.val = temp;
}
}
public void dfs(List<TreeNode> list, TreeNode root){
if(root != null){
dfs(list,root.left);
list.add(root);
dfs(list,root.right);
}
}
}