熟读力扣300题,不会写题也会敲。
二叉树是一种数据结构,每个节点都有左右两个孩子。
在树这种结构中,递归思想很重要。
比如我想知道我孩子、孙子中谁用我的号打王者。我只要问一下左孩子和右孩子,然后左孩子问它的左孩子和右孩子,右孩子也是这种操作。最后我会收到左孩子和左孩子的反馈。
在刷leetcode树这一章的时候,有时候会很懵逼,因为人脑递归和程序真实的递归有时候不同,这里就需要进行debug,debug对了解递归有很大帮助。
首先要构建出来一棵二叉树:
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;
}
}
leetcode输入一般是这种,给定二叉树 [3,9,20,null,null,15,7]
怎么根据这种输入数组构建一颗二叉树呢?
//层次遍历的方法构建二叉树
public static TreeNode createTree(Integer[] arr){
Queue<TreeNode> que = new ArrayDeque<>();
TreeNode Root = new TreeNode(arr[0]);
que.add(Root);
int index = 0;
while(!que.isEmpty()){
int size = que.size();
while (size -->0){
TreeNode node = que.poll();
TreeNode left = null;
TreeNode right = null;
//如果数组的值不是null且下标在长度范围内
if(++index < arr.length && arr[index]!=null){
left = new TreeNode(arr[index]);//构建左子树
que.add(left);//把左子树加入队列
}
if(++index < arr.length && arr[index]!=null){
right = new TreeNode(arr[index]);
que.add(right);
}
//当前节点接上自己的左右孩子
node.left = left;
node.right = right;
}
}
return Root;//返回根节点
}
怎么确定自己构建的二叉树是对的呢?
1、debug看一看
2、打印出来
打上断点
可以一步一步debug体验一下,最后整个二叉树的结构很清晰。
最后上菜
import java.util.ArrayDeque;
import java.util.Queue;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class tree {
public static void main(String[] args) {
Integer [] arr = {3,9,20,null,null,15,7};
TreeNode root = createTree(arr);
PrintTree(root);
}
//构建二叉树
public static TreeNode createTree(Integer[] arr){
Queue<TreeNode> que = new ArrayDeque<>();
TreeNode Root = new TreeNode(arr[0]);
que.add(Root);
int index = 0;
while(!que.isEmpty()){
int size = que.size();
while (size -->0){
TreeNode node = que.poll();
TreeNode left = null;
TreeNode right = null;
//如果数组的值不是null且下标在长度范围内
if(++index < arr.length && arr[index]!=null){
left = new TreeNode(arr[index]);//构建左子树
que.add(left);//把左子树加入队列
}
if(++index < arr.length && arr[index]!=null){
right = new TreeNode(arr[index]);
que.add(right);
}
//当前节点接上自己的左右孩子
node.left = left;
node.right = right;
}
}
return Root;//返回根节点
}
//层级打印二叉树
public static void PrintTree(TreeNode Root){
Queue<TreeNode> que = new ArrayDeque<>();
if(Root != null)
que.add(Root);
while (!que.isEmpty()){
TreeNode node = que.poll();
System.out.print(node.val+" ");
if(node.left!=null)
que.add(node.left);
if(node.right!=null)
que.add(node.right);
}
}
}