二叉树1

105 阅读1分钟

二叉树的中序遍历

stack 和 递归

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> list = new ArrayList<>();
    if(root == null) return list;
    Stack<TreeNode> stack = new Stack<>();
  // while (root != null || !stack.isEmpty())
    while(root != null || !stack.isEmpty()) {
        while(root != null){
            stack.push(root);
            root = root.left;
        }
        root = stack.pop();
        list.add(root.val);
        root = root.right;
    }
    return list;
}
public void Traverse(TreeNode root) {
  if (root == null) return;
  Traverse(root.left);
  print(root);
  Traverse(root.right);
  
}

应用

230. 二叉搜索树中第K小的元素

迭代

class Solution {
    public int kthSmallest(TreeNode root, int k) {
        Stack<TreeNode> stack = new Stack<>();
        if (root == null || k == 0) return 0;
        while (root != null || !stack.isEmpty()) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            if (--k == 0) {
                return root.val;
            }
            root = root.right;
        }
        return 0;    
    }
}

递归:

int rank = 0;
int result = Integer.MIN_VALUE;
​
public int kthSmallest(TreeNode root, int k) {
    traverse(root, k);
    return result;
}
​
public void traverse(TreeNode root, int k) {
    if(root == null) return;
    traverse(root.left, k);
    rank++;
    if(rank == k) result = root.val;
    traverse(root.right, k);       
}

98. 验证二叉搜索树

范围法:

class Solution {
    public boolean helper(TreeNode root, long min, long max) {
        if (root == null) return true;
        if (root.val <= min || root.val >= max) return false;
        return helper(root.left, min, root.val) && helper(root.right, root.val, max);
    }
​
    public boolean isValidBST(TreeNode root) {
        return helper(root.left, Long.MIN_VALUE, root.val) && helper(root.right, root.val, Long.MAX_VALUE);
    }
}
public boolean isValidBST(TreeNode root) {
        return helper(root, Long.MIN_VALUE, Long.MAX_VALUE);  
        //&& helper(root.right, root.val, Long.MAX_VALUE);
    }
    
    public boolean helper(TreeNode root, long min, long max) {
        if (root == null) return true;
        if (root.val <= min || root.val >= max) return false;
        return helper(root.left, min, root.val) && helper(root.right, root.val, max);
    }
}

中序遍历:

public boolean isValidBST(TreeNode root) {
   if (root == null) return true;
   Stack<TreeNode> stack = new Stack<>();
   TreeNode pre = null;
   while (root != null || !stack.isEmpty()) {
      while (root != null) {
         stack.push(root);
         root = root.left;
      }
      root = stack.pop();
      if(pre != null && root.val <= pre.val) return false;
      pre = root;
      root = root.right;
   }
   return true;
}

538. 把二叉搜索树转换为累加树

二叉树相关,大部分用二叉树递归模板,如前序、后序、中序遍历模板的基础上操作。

这个题,用这个思路(上面那句话+思考当下根节点应该干什么事情,如可以思考:把全部的比自己大的结点值加起来,但行不通。)

思考使用二叉搜索树的中序。具有生序作用。

那我们可以倒序,不就是,把所有比自己大的数值加起来嘛

    private int sum = 0;
    public TreeNode convertBST(TreeNode root) {
        traverse(root);
        return root;
    }
​
    public void traverse(TreeNode root) {
        if (root == null) {
            return;
        }
        traverse(root.right);
        sum += root.val;
        root.val = sum;
        traverse(root.left);
    }