二叉树
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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; } }
|
二叉树的遍历
前序遍历
先访问树的根节点 然后遍历左子树 最后遍历右子树
中序遍历
先遍历左子树 然后访问树的根节点 最后遍历右子树
后序遍历
先遍历左子树 然后遍历右子树 最后访问树的根节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public List<Integer> orderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); traverse(root, res); return res; }
public void traverse(TreeNode root, List<Integer> res) { if (root == null) { return; } traverse(root.left, res); traverse(root.right, res); } }
|
特点:前序遍历 第一个元素是root节点
层次遍历
二叉树的经典问题
翻转;判断是否对称;
二叉搜索树
定义:
- 节点左子树只包含小于当前节点的数
- 节点右子树只包含大于当前节点的数
- 左子树和右子树也必须是二叉搜索树
二叉树的中序遍历 是一个升序
1 2 3 4 5 6 7 8
| public void traverse(TreeNode root, List<Integer> res) { if (root == null) { return; } traverse(root.left, res); traverse(root.right, res); }
|
要降序该如何处理 中序遍历时交换 traverse(root.left, res)和 traverse(root.right, res)的顺序
1 2 3 4 5 6 7 8
| public void traverse(TreeNode root, List<Integer> res) { if (root == null) { return; } traverse(root.right, res); traverse(root.left, res); }
|
常见面试题 验证一棵树为二叉搜索树,BST的搜索、插入、删除操作
验证BST
BST的搜索
1 2 3 4 5 6 7 8 9 10 11 12
| public TreeNode searchBST(TreeNode root, int val) { if (root == null) { return null; } if (root.val == val) { return root; } else if (root.val > val) { return searchBST(root.left, val); } else { return searchBST(root.right, val); } }
|
BST的插入
BST的删除