二叉树基础
入度和出度是什么?
根节点和叶节点是什么?
二叉树有哪些分类?
- 满二叉树:只有度为0和杜威2的节点,并且度为0的节点在同一层上,则为满二叉树。说人话就是,如果一颗二叉树的层数是k,那么它一定有2^k-1个节点,也就是说除最下面一层之外,每一个节点都有两个分叉。
- 完全二叉树:除最后一层没有完全填满,其他层节点都达到最大值,并且最后一层的节点都集中在最左边。图片来源:代码随想录 (programmercarl.com)
优先级队列的本质是堆,堆是一种完全二叉树,同时保证了父子节点的顺序关系。
- 二叉搜索树:前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树。注意:这里是所有节点都满足一定的大小关系,不只是第一层和第二层。
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树
- 平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。顾名思义,就是左右子树的大小平衡,不能相差太多,最多相差一层,这样设计是为了加快搜索速度。
二叉树的定义
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;
}
}
深度优先遍历
前序、中序、后序遍历是指什么?
- 前序遍历是指”中“的位置,比如:“中”在“左右”之前,为前序遍历
迭代法和递归法是什么?
迭代法和递归法都是循环的一种。
- 递归是重复调用函数本身实现循环,底层是栈,遇到满足终止条件的情况时,逐层返回来结束,所以可能导致栈溢出。初学者理解难度比较大,可以通过画图仔细思考。
- 迭代和普通循环的区别是:迭代时,循环代码中参与运算的遍历同时是保存结果的遍历,当前保存的结果作为下一次循环计算的初始值,如斐波那契数列的计算。迭代法使用计数器结束循环。
- 二者关系:所有的迭代法都可以转化成递归,但是递归不一定可以转化成迭代。
前序遍历144. 二叉树的前序遍历 - 力扣(LeetCode)
思路:
递归法逐层返回:
- 递归函数的参数
traversal(?)
| 参数 | |
|---|---|
| 当前节点 | TreeNode node |
| 记录数据 | ArrayLIst<Integer> result |
| 返回值 | void |
-
递归终止条件 当前节点为null;返回
-
递归函数体
根据遍历顺序,完成节点值记录
public void pretraversal(TreeNode node,ArrayList<Integer> result) {
if(node == null) {
return;
}
result.add(node.val);// 中
pretraversal(node.left,result);// 左
pretraversal(node.right,result);// 右
}
代码:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
pretraversal(root,result);
return result;
}
public void pretraversal(TreeNode node,ArrayList<Integer> result) {
if(node == null) {
return;
}
result.add(node.val);// 中
pretraversal(node.left,result);// 左
pretraversal(node.right,result);// 右
}
}
学习时长:45min