仅为个人记录复盘学习历程,解题思路来自代码随想录
代码随想录刷题笔记总结网址:
代码随想录
二叉树理论基础学习
二叉树有两种主要的形式:满二叉树和完全二叉树。
满二叉树:只有度为0的结点和度为2的结点,且度为0的结点在同一层的二叉树。深度为k,有2^k-1个节点。
完全二叉树:除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置的二叉树。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。
二叉搜索树:一个有序树满足以下特点:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树
平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,一棵空的或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是平衡二叉树的二叉树。
二叉树可以链式存储,也可以顺序存储。链式存储方式就用指针, 顺序存储的方式就是用数组。
数组来存储二叉树的遍历方式:如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。
二叉树的遍历方式:
- 深度优先遍历
- 前序遍历(递归法,迭代法)
- 中序遍历(递归法,迭代法)
- 后序遍历(递归法,迭代法)
- 广度优先遍历
- 层次遍历(迭代法)
深度优先遍历的前中后,其实指的就是中间节点的遍历顺序。
深度优先遍历一般使用栈(递归)实现,广度优先遍历一般使用队列实现。
二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。
二叉树的递归遍历学习
递归的三要素:
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
144.二叉树的前序遍历
给你二叉树的根节点 root
,返回它节点值的前序遍历。
提供参数:TreeNode root
根据递归遍历学习中,确认递归的三要素可以很好的通过递归实现二叉树的前序遍历。
递归的三要素:
1.参数和返回值类型:需要对二叉树进行遍历,参数需要树的根节点,还需要一个整数数组获取遍历的结果。遍历并将结果记录在数组中,返回值类型为void。
2.终止条件:二叉树的搜索中当节点为null时,应当返回。
3.递归逻辑:前序遍历中,先记录root的值,再递归遍历左子树,结束后再递归遍历右子树。
主要操作:
通过递归定义前序遍历函数。
public void preorder(TreeNode root,List<Integer>res){
if(root==null) return;
res.add(root.val);
preorder(root.left,res);
preorder(root.right,res);
}
创建结果数组
调用递归函数
返回结果数组
94.二叉树的中序遍历
给你二叉树的根节点 root
,返回它节点值的中序遍历。
提供参数:TreeNode root
思路和上一题类似,关键的使用递归实现中序遍历函数大致如下:
//遍历方法
public void inorder(TreeNode root,List<Integer>res){
//终止条件
if(root==null) return;
//递归逻辑
inorder(root.left,res);
res.add(root.val);
inorder(root.right,res);
}
145.二叉树的后序遍历
给你二叉树的根节点 root
,返回它节点值的后序遍历。
提供参数:TreeNode root
思路大致与前一题类似,主要的使用递归实现后序遍历函数大致如下:
public void postorder(TreeNode root,List<Integer>res){
if(root==null) return ;
postorder(root.left,res);
postorder(root.right,res);
res.add(root.val);
}
标签:遍历,递归,res,随想录,节点,二叉树,root,日记,刷题
From: https://blog.csdn.net/weixin_73939095/article/details/143181029