一、找树左下角的值(LeetCode513)
递归
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
int maxdeeep = -1;// 全局变量 记录最大深度
int res = 0; // 全局变量 最大深度最左节点的数值
public int findBottomLeftValue(TreeNode root) {
if(root == null) return 0;
travesal(root,0);
return res;
}
void travesal(TreeNode node,int deep){
if(node.left == null && node.right == null){
if(deep > maxdeeep){
maxdeeep = deep;// 更新最大深度
res = node.val;// 最大深度最左面的数值
}
return;
}
if(node.left != null){
travesal(node.left,deep +1);
}
if(node.right != null){
travesal(node.right,deep +1);
}
}
}
迭代
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
public int findBottomLeftValue(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int res = 0;
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0;i<size;i++){
TreeNode node = queue.poll();
if(i == 0){
res = node.val;
}
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
}
return res;
}
}
二、路径总和(LeetCode112)
递归
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if (root == null) {
return false;
}
targetSum -= root.val;
// 叶子结点
if (root.left == null && root.right == null) {
return targetSum == 0;
}
if (root.left != null) {
boolean left = hasPathSum(root.left, targetSum);
if (left) { // 已经找到
return true;
}
}
if (root.right != null) {
boolean right = hasPathSum(root.right, targetSum);
if (right) { // 已经找到
return true;
}
}
return false;
}
}
三、路径总和||(LeetCode113)
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
List<List<Integer>> res = new LinkedList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
travesal(root,targetSum);
return res;
}
void travesal(TreeNode node,int cnt){
if(node == null){
return;
}
path.offer(node.val);
cnt -= node.val;
if (node.left == null && node.right == null && cnt == 0) {
res.add(new LinkedList<>(path));
}
travesal(node.left, cnt);
travesal(node.right, cnt);
path.removeLast(); // 回溯
}
}
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res; // 非空判断
List<Integer> path = new LinkedList<>();
preorderdfs(root, targetSum, res, path);
return res;
}
public void preorderdfs(TreeNode root, int targetSum, List<List<Integer>> res, List<Integer> path) {
path.add(root.val);
// 遇到了叶子节点
if (root.left == null && root.right == null) {
// 找到了和为 targetsum 的路径
if (targetSum - root.val == 0) {
res.add(new ArrayList<>(path));
}
return; // 如果和不为 targetsum,返回
}
if (root.left != null) {
preorderdfs(root.left, targetSum - root.val, res, path);
path.remove(path.size() - 1); // 回溯
}
if (root.right != null) {
preorderdfs(root.right, targetSum - root.val, res, path);
path.remove(path.size() - 1); // 回溯
}
}
}
四、构造二叉树(LeetCode106、105)
从中序与后序遍历
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
Map<Integer,Integer> map =new HashMap<>();// 方便根据数值查找位置
public TreeNode buildTree(int[] inorder, int[] postorder) {
for(int i = 0;i<inorder.length;i++){
map.put(inorder[i],i);// 用map保存中序序列的数值对应位置
}
return findNode(inorder,0,inorder.length,postorder,0,postorder.length);
}
TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) {
// 参数里的范围都是前闭后开
if (inBegin >= inEnd || postBegin >= postEnd) { // 不满足左闭右开,说明没有元素,返回空树
return null;
}
int rootIndex = map.get(postorder[postEnd - 1]); // 找到后序遍历的最后一个元素在中序遍历中的位置
TreeNode root = new TreeNode(inorder[rootIndex]); // 构造结点
int lenOfLeft = rootIndex - inBegin; // 保存中序左子树个数,用来确定后序数列的个数
root.left = findNode(inorder, inBegin, rootIndex,
postorder, postBegin, postBegin + lenOfLeft);
root.right = findNode(inorder, rootIndex + 1, inEnd,
postorder, postBegin + lenOfLeft, postEnd - 1);
return root;
}
}
从前序与中序遍历
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
Map<Integer,Integer> map = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
for(int i = 0;i<inorder.length;i++){
map.put(inorder[i],i);
}
return findNote(preorder,0,preorder.length,inorder,0,inorder.length);// 前闭后开
}
public TreeNode findNote(int[] preorder,int preorderbegin,int preorderend,int[] inorder,int inorderbegin,int inorderend ){
if(preorderbegin>=preorderend||inorderbegin>=inorderend){
return null;// 不满足左闭右开,说明没有元素,返回空树
}
int rootIndex = map.get(preorder[preorderbegin]);// 找到前序遍历的第一个元素在中序遍历中的位置
TreeNode node = new TreeNode(inorder[rootIndex]);
int leftnum = rootIndex - inorderbegin;// 保存中序左子树个数,用来确定前序数列的个数
node.left = findNote(preorder,preorderbegin+1,preorderbegin+leftnum+1,inorder,inorderbegin,rootIndex);
node.right = findNote(preorder,preorderbegin+leftnum+1,preorderend,inorder,rootIndex+1,inorderend);
return node;
}
}
本文介绍了使用递归和迭代方法解决LeetCode上的几个二叉树问题,包括寻找树的左下角值(513题),路径总和(112题)以及路径总和II(113题),并提供了构造二叉树的算法,基于中序与后序遍历(106题,105题)以及前序与中序遍历的解法。
1032

被折叠的 条评论
为什么被折叠?



