文档讲解:代码随想录
- 二叉搜索树是有序的
- 利用中序遍历来从小到大进行遍历
- 利用pre指针记录前一个节点方便求差值
// 递归
class Solution {
TreeNode pre = null;
int res = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
traversal(root);
return res;
}
public void traversal(TreeNode root) {
if(root == null)return;
traversal(root.left);
if(pre != null) {
res = Math.min(res, root.val - pre.val);
}
pre = root;
traversal(root.right);
}
}
// 迭代
class Solution {
public int getMinimumDifference(TreeNode root) {
ArrayDeque<TreeNode> deque = new ArrayDeque<>();
TreeNode cur = root;
TreeNode pre = null;
int res = Integer.MAX_VALUE;
while(cur != null || !deque.isEmpty()) {
if(cur != null) {
deque.push(cur);
cur = cur.left;
} else {
cur = deque.pop();
if(pre != null)res = Math.min(res, cur.val - pre.val);
pre = cur;
cur = cur.right;
}
}
return res;
}
}
// 递归法
class Solution {
ArrayList<Integer> list = new ArrayList<>();
int maxCount = 0;
int count = 0;
TreeNode pre = null;
public int[] findMode(TreeNode root) {
find(root);
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
public void find(TreeNode root) {
if(root == null)return;
find(root.left);
if(pre == null)count = 1;
else if(pre.val == root.val)count++;
else count = 1;
if(count > maxCount) {
list.clear();
list.add(root.val);
maxCount = count;
} else if(count == maxCount) {
list.add(root.val);
}
pre = root;
find(root.right);
}
}
// 迭代法
class Solution {
public int[] findMode(TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
int maxCount = 0;
int count = 0;
ArrayDeque<TreeNode> deque = new ArrayDeque<>();
TreeNode cur = root;
TreeNode pre = null;
while(cur != null || !deque.isEmpty()) {
if(cur != null) {
deque.push(cur);
cur = cur.left;
} else {
cur = deque.pop();
if(pre == null)count = 1;
else if(pre.val == cur.val)count++;
else count = 1;
if(count > maxCount) {
list.clear();
list.add(cur.val);
maxCount = count;
} else if(count == maxCount) {
list.add(cur.val);
}
pre = cur;
cur = cur.right;
}
}
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
}
- 从下向上遍历(后序遍历)
- 要遍历整棵树而非遍历一条边
// 递归
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == p || root == q || root == null)return root;
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p ,q);
if(left != null && right != null)return root;
else if(left != null && right == null)return left;
else if(left == null && right != null)return right;
return null;
}
}
心得:中序遍历和二叉树确实经常出现