什么是二叉树
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。
二叉树的中序遍历:
中序遍历的结果是【D, B, E, A, F, C, G】
如何实现(左中右):
- 解题思路:递归
直接上代码:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();//使用list存储结果
inoder(root, list);//调用关键方法
return list;
}
// 递归遍历
public void inoder(TreeNode root,List list){
if(root == null){ //如果当前节点为null 这直接退出递归
return;
}
inoder(root.left, list); // 访问左子树
list.add(root.val); // 将节点的值存入到list中
inoder(root.right,list); //访问右子树
}
}
- 解题思路:迭代
class Solution {
// 迭代遍历 通过压栈和出栈来模拟递归过程 本质和上面的递归是一样的
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Deque<TreeNode> stk = new LinkedList<TreeNode>(); //隐形大脑记忆初始化栈
while (root != null || !stk.isEmpty()) { // 如果节点为空或栈为空 则遍历结束
while (root != null) { //如果根节点不为空
stk.push(root); // 将根节点压栈
root = root.left; //访问左子树 直到直到左子树为空 且把根已记忆
}
root = stk.pop(); // 存在节点为空 此时栈中从栈顶的元素一定为子树的最左边一个子节点
res.add(root.val); // 将当前子节点存入列表中 他是左子树
root = root.right; //访问右节点
}
return res;
}
}
二叉树的层级遍历:
遍历二叉树的代码框架
// An highlighted block
public void traverse (TreeNode root){
if(root==null) return ;
Queue<TreeNode> q=new LinkedList();
List<Integer> res = new ArrayList<Integer>();
q.offer(root);
while(!q.isEmpty){
TreeNode cur=q.poll();
res.add(cur.val);
if(cur.lef!=null){
q.offer(cur.left);
}
if(cur.rig!=null){
q.offer(cur.rig);
}
}