ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

力扣labuladong——一刷day51

2026/8/15 15:03:55 拓冰建站 浏览量
力扣labuladong——一刷day51

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、力扣106. 从中序与后序遍历序列构造二叉树
  • 二、力扣889. 根据前序和后序遍历构造二叉树
  • 三、力扣331. 验证二叉树的前序序列化
  • 四、力扣426. 将二叉搜索树转化为排序的双向链表


前言


二叉树的递归分为「遍历」和「分解问题」两种思维模式,这道题需要用到「分解问题」的思维。

一、力扣106. 从中序与后序遍历序列构造二叉树

/*** 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);}return fun(inorder,postorder,0,inorder.length-1,0,postorder.length-1);}public TreeNode fun(int[] inorder, int[] postorder, int inLow, int inHigh,int postLow,int  postHigh){if(inLow > inHigh){return null;}int index = map.get(postorder[postHigh]);TreeNode cur = new TreeNode(postorder[postHigh]);int len = index - inLow;cur.left = fun(inorder,postorder,inLow,index-1,postLow,postLow+len-1);cur.right = fun(inorder,postorder,index+1,inHigh,postLow+len,postHigh-1);return cur;}
}

二、力扣889. 根据前序和后序遍历构造二叉树

/*** 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 constructFromPrePost(int[] preorder, int[] postorder) {for(int i = 0; i < postorder.length; i ++){map.put(postorder[i],i);}return fun(preorder,postorder,0,preorder.length-1,0,postorder.length-1);}public TreeNode fun(int[] preorder,int[] postorder,int preLow, int preHigh,int postLow,int postHigh){if(preLow > preHigh){return null;}TreeNode cur = new TreeNode(preorder[preLow]);if(preLow + 1 <= preHigh){int index = map.get(preorder[preLow+1]);int len = index - postLow +1;cur.left = fun(preorder,postorder,preLow+1,preLow+len,postLow,index);cur.right = fun(preorder,postorder,preLow+len+1,preHigh,index+1,postHigh-1);}return cur;}
}

三、力扣331. 验证二叉树的前序序列化

class Solution {public boolean isValidSerialization(String preorder) {int edge = 1;for(String s : preorder.split(",")){if(s.equals("#")){edge -= 1;if(edge < 0){return false;}}else{edge -= 1;if(edge < 0){return false;}edge += 2;}}return edge == 0;}
}

四、力扣426. 将二叉搜索树转化为排序的双向链表

/*
// Definition for a Node.
class Node {public int val;public Node left;public Node right;public Node() {}public Node(int _val) {val = _val;}public Node(int _val,Node _left,Node _right) {val = _val;left = _left;right = _right;}
};
*/class Solution {Node pre = null, first = null;boolean flag = true;public Node treeToDoublyList(Node root) {if(root == null){return null;}fun(root);first.left = pre;pre.right = first;return first;}public void fun(Node root){if(root == null){return ;}fun(root.left);if(pre != null){pre.right = root;root.left = pre;}pre = root;if(flag){first = root;flag = false;}fun(root.right);}
}