版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/87474802
1 二叉树
- 节点的高度: 节点到叶子节点的最长路径(边数)
- 节点深度:根节点到这个节点所经历的边的个数;
2 二叉搜索树
- 左子树上所有节点的值均小于它的根节点的值;
- 右子树上所有节点的值均大于它的根节点的值;
3 验证二分搜索树
https://leetcode.com/problems/validate-binary-search-tree/
- 思路1: 中序遍历,看输出是否有序,O(N)
- 思路2: 递归, O(N)
public boolean isValidBST(TreeNode root) {
ArrayList<Integer> keys = new ArrayList<>();
inOrder(root, keys);
for (int i = 1; i < keys.size(); i++) {
if (keys.get(i - 1).compareTo(keys.get(i)) >= 0) {
return false;
}
}
return true;
}
private void inOrder(TreeNode node, ArrayList<Integer> keys) {
if (node == null) {
return;
}
inOrder(node.left, keys);
keys.add(node.val);
inOrder(node.right, keys);
}
4 二叉树的最近公共祖先
https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/
- 思路1: 按照路径寻找重合点,时间复杂度 O(N)
- 思路2: 递归,时间复杂度,O(N)
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root == p || root == q) {
return root;
}
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (left == null) {
return right;
} else if (right == null) {
return left;
} else {
return root;
}
}
5 二叉搜索树的最近公共祖先
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
int parentVal = root.val;
int pVal = p.val;
int qVal = q.val;
if (pVal > parentVal && qVal > parentVal) {
return lowestCommonAncestor(root.right, p, q);
} else if (pVal < parentVal && qVal < parentVal) {
return lowestCommonAncestor(root.left, p, q);
} else {
return root;
}
}