Tree
树描述的是节点之间的父子关系
节点:树中的每一个元素
根节点:树中最上层的唯一的节点
叶子节点:没有孩子的节点
高度:从最底层算起,从0开始
深度:从最高层算起,从0开始
层:从最高层算起,从1开始
二叉树
普通二叉树:每个节点最多两个孩子
满二叉树:除了叶子节点,每个节点都是两个孩子,并且所有叶子节点都在一层。
完全二叉树:从根节点起,从上到下,从左到右,依次填满节点形成的二叉树
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
遍历
根据根节点的访问顺序分为前中后,左右子树都是依次遍历的。
前序遍历
根节点-左子树-右子树
中序遍历
左子树-根节点-右子树
后序遍历
左子树-右子树-根节点
前序遍历:A-B-D-E-C-F-G
中序遍历:D-B-E-A-F-C-G
后序遍历:D-E-B-F-G-C-A
树相关leetcode
树在工作中很少单独使用,leetcode会给出树的结构,因此不讨论树的常用操作。
No.144 二叉树的前序遍历
思路:创建一个集合存放树的节点,如果根节点不为空,将根节点的值加入集合,然后递归调用方法传入根节点的左子树,将返回的集合使用addAll方法加入集合,然后递归调用方法传入根节点的右子树,将返回的集合使用addAll方法加入集合,最后返回集合。
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root != null) {
result.add(root.val);
result.addAll(preorderTraversal(root.left));
result.addAll(preorderTraversal(root.right));
}
return result;
}
}
No.94 二叉树的中序遍历
思路:创建一个集合存放树的节点,如果根节点不为空,递归调用方法传入根节点的左子树,将返回的集合使用addAll方法加入集合,然后将根节点的值加入集合,然后递归调用方法传入根节点的右子树,将返回的集合使用addAll方法加入集合,最后返回集合。
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root != null) {
result.addAll(inorderTraversal(root.left));
result.add(root.val);
result.addAll(inorderTraversal(root.right));
}
return result;
}
}
No.145 二叉树的后序遍历
思路:创建一个集合存放树的节点,如果根节点不为空,递归调用方法传入根节点的左子树,将返回的集合使用addAll方法加入集合,然后递归调用方法传入根节点的右子树,将返回的集合使用addAll方法加入集合,然后将根节点的值加入集合,最后返回集合。
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root != null) {
result.addAll(postorderTraversal(root.left));
result.addAll(postorderTraversal(root.right));
result.add(root.val);
}
return result;
}
}