二叉搜索树中序遍历是递增序列
二叉搜索树中序遍历是递增序列
二叉搜索树中序遍历是递增序列
直接上题 leetcode 99. 恢复二叉搜索树
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
输入: [1,3,null,null,2]
1
/
3
\
2输出: [3,1,null,null,2]
3
/
1
\
2
示例 2:输入: [3,1,4,null,null,2]
3
/ \
1 4
/
2输出: [2,1,4,null,null,3]
2
/ \
1 4
/
3
直接按照中序遍历为递增的特性去判断:
/**
* 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 {
private TreeNode err1,err2;
public void recoverTree(TreeNode root) {
List<TreeNode> L=new LinkedList<TreeNode>();
dfs(root,L);
err1.val=err2.val-err1.val;
err2.val=err2.val-err1.val;
err1.val=err2.val+err1.val;
return ;
}
private void dfs(TreeNode r,List<TreeNode> L){
if(r==null)return;
dfs(r.left,L);
if(L.size()>0&&L.get(L.size()-1).val>r.val){
if(err1==null){
err1=L.get(L.size()-1);
err2=r;
}
else{
err2=r;
}
}
L.add(r);
dfs(r.right,L);
}
}
另一题 leetcode 538. 把二叉搜索树转换为累加树
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 原始二叉搜索树:
5
/ \
2 13输出: 转换为累加树:
18
/ \
20 13
同上:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int sum;
public TreeNode convertBST(TreeNode root) {
if(root==null) return root;
convertBST(root.right);
sum+=root.val;
root.val=sum;
convertBST(root.left);
return root;
}
}