目录
一、二叉树的前序遍历
前序:先遍历根结点——>左结点——>右结点
思路:①先建立链表存放要打印的结点
②如果根节点为空,返回
③如果根结点不为空,递归遍历
代码实现:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root==null) return list;
list.add(root.val);
list.addAll(preorderTraversal(root.left));
list.addAll(preorderTraversal(root.right));
return list;
}
}
二、二叉树的中序遍历
中序:先遍历左结点——>根结点——>右结点
思路:
①先建立链表存放要打印的结点
②如果根节点为空,返回
③如果根结点不为空,递归遍历
代码实现:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root==null) return list;
list.addAll(inorderTraversal(root.left));
list.add(root.val);
list.addAll(inorderTraversal(root.right));
return list;
}
}
三、二叉树的后序遍历
中序:先遍历左结点——>右结点——>根结点
思路:
①先建立链表存放要打印的结点
②如果根节点为空,返回
③如果根结点不为空,递归遍历
代码实现:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root==null) return list;
list.addAll(inorderTraversal(root.left));
list.addAll(inorderTraversal(root.right));
list.add(root.val);
return list;
}
}
四、二叉树的层序遍历
层序:一层一层的遍历
思路:“二维数组思路来实现” 代码片段注释上有
代码实现:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//创建二维数组
List<List<Integer>> ret = new ArrayList<>();
//判断根结点是否为空
if(root==null) return ret;
//创建一个队列
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
//当队列不为空的时候循环
while(!queue.isEmpty()){
//创建每一层的链表
List<Integer> list = new ArrayList<>();
int size = queue.size();
while(size>0){
TreeNode cur =queue.poll();
list.add(cur.val);
if(cur.left!=null){
queue.offer(cur.left);
}
if(cur.right!=null){
queue.offer(cur.right);
}
size--;
}
ret.add(list);
}
return ret;
}
}
五、求结点个数
1、遍历思路
static int size = 0;
void getSize1(BTNode root) {
if (root != null) {
size++;
getSize1(root.left);
getSize1(root.right);
}
}
2、大问题化小问题思路
左子树+右子树+1
int getSize2(BTNode root) {
int size=0;
if (root != null) {
size++;
size= getSize2(root.left) + getSize2(root.right) + 1;
}
return size;
}
六、求叶子结点个数
1、遍历思路
static int leafSize = 0;
void getLeafSize1(BTNode root) {
if (root==null){
return;
}
if (root.right==null&&root.left==null){
leafSize++;
}
getLeafSize1(root.left);
getLeafSize1(root.right);
}
2、子问题思路
int getLeafSize2(BTNode root) {
int leafSize = 0;
if (root==null){
return 0;
}
if (root.right==null&&root.left==null){
leafSize++;
}
return getLeafSize2(root.left)+ getLeafSize2(root.right);
}
七、求第k层结点个数
int getKLevelSize(BTNode root,int k){
if (root==null){
return 0;
}
if (k==1){
return 1;
}
return getKLevelSize(root.left,k-1)+ getKLevelSize(root.right,k-1);
}
八、获取二叉树的高度
class Solution {
public int maxDepth(TreeNode root) {
if(root==null) return 0;
int leftHight = maxDepth(root.left);
int rightHight = maxDepth(root.right);
return (leftHight>rightHight)?leftHight+1:rightHight+1;
}
}
九、查找val所在的结点
TNode find(BTNode root, char val) {
if (root==null) return null;
if (root.val==val){
return root;
}
BTNode ret1=find(root.left,val);
if (ret1!=null){//在左子树中
return ret1;
}
BTNode ret2=find(root.right,val);
if (ret2!=null){//在右子树中
return ret2;
}
return null;//没有找到
}