二叉树和二叉搜索树

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
        }

    }

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/87474802
今日推荐