数据结构与算法-二叉树

打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

前序遍历二叉树-Leetcode 144

   给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
  
  示例 1:
  输入:root = [1,null,2,3]
  输出:[1,2,3]
  解释:
  
  

  示例 2:
  输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]
  输出:[1,2,4,5,6,7,3,8,9]
  解释:
  
  

  示例 3:
  输入:root = []
  输出:[]
  示例 4:
  输入:root = [1]
  输出:[1]
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;  // 节点的值
  5. *     TreeNode left;  // 左子节点
  6. *     TreeNode right;  // 右子节点
  7. *     TreeNode() {}  // 默认构造函数
  8. *     TreeNode(int val) { this.val = val; }  // 使用给定值初始化节点
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     /**
  18.      * 前序遍历二叉树的方法。
  19.      * 前序遍历顺序:访问根节点 -> 遍历左子树 -> 遍历右子树
  20.      *
  21.      * @param root 二叉树的根节点
  22.      * @return 返回前序遍历的结果列表
  23.      */
  24.     public List<Integer> preorderTraversal(TreeNode root) {
  25.         List<Integer> result = new ArrayList<Integer>();  // 存储前序遍历结果的列表
  26.         preorder(root, result);  // 调用递归方法进行前序遍历
  27.         return result;  // 返回前序遍历的结果
  28.     }
  29.     /**
  30.      * 递归实现前序遍历。
  31.      *
  32.      * @param node 当前处理的节点
  33.      * @param result 用于存储遍历结果的列表
  34.      */
  35.     private void preorder(TreeNode node, List<Integer> result) {
  36.         if (node == null) {  // 如果当前节点为空,直接返回
  37.             return;
  38.         }
  39.         result.add(node.val);  // 将当前节点的值添加到结果列表中(访问根节点)
  40.         preorder(node.left, result);  // 递归遍历左子树
  41.         preorder(node.right, result);  // 递归遍历右子树
  42.     }
  43. }
复制代码

中序遍历二叉树-Leetcode 94

   给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
  
  示例 1:
  

  1. <strong>输入:</strong>root = [1,null,2,3]
  2. <strong>输出:</strong>[1,3,2]
复制代码
示例 2:
  1. <strong>输入:</strong>root = []
  2. <strong>输出:</strong>[]
复制代码
示例 3:
  1. <strong>输入:</strong>root = [1]
  2. <strong>输出:</strong>[1]
复制代码
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;  // 节点的值
  5. *     TreeNode left;  // 左子节点
  6. *     TreeNode right;  // 右子节点
  7. *     TreeNode() {}  // 默认构造函数
  8. *     TreeNode(int val) { this.val = val; }  // 使用给定值初始化节点
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     /**
  18.      * 中序遍历二叉树的方法。
  19.      * 中序遍历顺序:遍历左子树 -> 访问根节点 -> 遍历右子树
  20.      *
  21.      * @param root 二叉树的根节点
  22.      * @return 返回中序遍历的结果列表
  23.      */
  24.     public List<Integer> inorderTraversal(TreeNode root) {
  25.         List<Integer> result = new ArrayList<Integer>();  // 存储中序遍历结果的列表
  26.         inorder(root, result);  // 调用递归方法进行中序遍历
  27.         return result;  // 返回中序遍历的结果
  28.     }
  29.     /**
  30.      * 递归实现中序遍历。
  31.      *
  32.      * @param node 当前处理的节点
  33.      * @param result 用于存储遍历结果的列表
  34.      */
  35.     private void inorder(TreeNode node, List<Integer> result) {
  36.         if (node == null) {  // 如果当前节点为空,直接返回
  37.             return;
  38.         }
  39.         inorder(node.left, result);  // 递归遍历左子树
  40.         result.add(node.val);  // 将当前节点的值添加到结果列表中(访问根节点)
  41.         inorder(node.right, result);  // 递归遍历右子树
  42.     }
  43. }
复制代码

后序遍历二叉树-Leetcode 145

   给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 
  
  示例 1:
  输入:root = [1,null,2,3]
  输出:[3,2,1]
  解释:
  

  示例 2:
  输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]
  输出:[4,6,7,5,2,9,8,3,1]
  解释:
  

  示例 3:
  输入:root = []
  输出:[]
  示例 4:
  输入:root = [1]
  输出:[1]
  
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;  // 节点的值
  5. *     TreeNode left;  // 左子节点
  6. *     TreeNode right;  // 右子节点
  7. *     TreeNode() {}  // 默认构造函数
  8. *     TreeNode(int val) { this.val = val; }  // 使用给定值初始化节点
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     /**
  18.      * 后序遍历二叉树的方法。
  19.      * 后序遍历顺序:遍历左子树 -> 遍历右子树 -> 访问根节点
  20.      *
  21.      * @param root 二叉树的根节点
  22.      * @return 返回后序遍历的结果列表
  23.      */
  24.     public List<Integer> postorderTraversal(TreeNode root) {
  25.         List<Integer> result = new ArrayList<Integer>();  // 存储后序遍历结果的列表
  26.         postorder(root, result);  // 调用递归方法进行后序遍历
  27.         return result;  // 返回后序遍历的结果
  28.     }
  29.     /**
  30.      * 递归实现后序遍历。
  31.      *
  32.      * @param node 当前处理的节点
  33.      * @param result 用于存储遍历结果的列表
  34.      */
  35.     private void postorder(TreeNode node, List<Integer> result) {
  36.         if (node == null) {  // 如果当前节点为空,直接返回
  37.             return;
  38.         }
  39.         postorder(node.left, result);  // 递归遍历左子树
  40.         postorder(node.right, result);  // 递归遍历右子树
  41.         result.add(node.val);  // 将当前节点的值添加到结果列表中(访问根节点)
  42.     }
  43. }
复制代码
对称二叉树-Leetcode 101

   给你一个二叉树的根节点 root , 检查它是否轴对称。
  
  示例 1:
  

  1. <strong>输入:</strong>root = [1,2,2,3,4,4,3]
  2. <strong>输出:</strong>true
复制代码
示例 2:
  

  1. <strong>输入:</strong>root = [1,2,2,null,3,null,3]
  2. <strong>输出:</strong>false
复制代码
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;  // 节点的值
  5. *     TreeNode left;  // 左子节点
  6. *     TreeNode right;  // 右子节点
  7. *     TreeNode() {}  // 默认构造函数
  8. *     TreeNode(int val) { this.val = val; }  // 使用给定值初始化节点
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     /**
  18.      * 检查二叉树是否对称。
  19.      * 对称的定义是:左子树和右子树互为镜像。
  20.      *
  21.      * @param root 二叉树的根节点
  22.      * @return 如果树是对称的返回 true,否则返回 false
  23.      */
  24.     public boolean isSymmetric(TreeNode root) {
  25.         // 如果根节点为空,则认为是对称的
  26.         if (root == null) {
  27.             return true;
  28.         }
  29.         // 检查根节点的左子树和右子树是否对称
  30.         return check(root.left, root.right);
  31.     }
  32.     /**
  33.      * 递归检查两个子树是否互为镜像。
  34.      *
  35.      * @param left 当前处理的左子树的根节点
  36.      * @param right 当前处理的右子树的根节点
  37.      * @return 如果两棵子树互为镜像返回 true,否则返回 false
  38.      */
  39.     public boolean check(TreeNode left, TreeNode right) {
  40.         // 如果两个节点都为空,则它们是对称的
  41.         if (left == null && right == null) {
  42.             return true;
  43.         }
  44.         // 如果其中一个节点为空而另一个不为空,则它们不对称
  45.         if (left == null || right == null) {
  46.             return false;
  47.         }
  48.         // 如果两个节点的值不同,则它们不对称
  49.         if (left.val != right.val) {
  50.             return false;
  51.         }
  52.         // 递归检查:
  53.         // 左子树的左子节点和右子树的右子节点是否对称
  54.         // 左子树的右子节点和右子树的左子节点是否对称
  55.         return check(left.left, right.right) && check(left.right, right.left);
  56.     }
  57. }
复制代码

二叉树最大深度-Leetcode 104

   给定一个二叉树 root ,返回其最大深度。
  二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
  
  示例 1:
  
  

  
  1. <strong>输入:</strong>root = [3,9,20,null,null,15,7]
  2. <strong>输出:</strong>3
复制代码
示例 2:
  1. <strong>输入:</strong>root = [1,null,2]
  2. <strong>输出:</strong>2
复制代码

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;  // 节点的值
  5. *     TreeNode left;  // 左子节点
  6. *     TreeNode right;  // 右子节点
  7. *     TreeNode() {}  // 默认构造函数
  8. *     TreeNode(int val) { this.val = val; }  // 使用给定值初始化节点
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     /**
  18.      * 计算二叉树的最大深度。
  19.      * 最大深度是从根节点到最远叶子节点的最长路径上的节点数。
  20.      *
  21.      * @param root 二叉树的根节点
  22.      * @return 返回二叉树的最大深度
  23.      */
  24.     public int maxDepth(TreeNode root) {
  25.         // 如果当前节点为空,返回深度为0
  26.         if (root == null) {
  27.             return 0;
  28.         }
  29.         // 递归计算左子树的最大深度
  30.         int leftDepth = maxDepth(root.left);
  31.         // 递归计算右子树的最大深度
  32.         int rightDepth = maxDepth(root.right);
  33.         // 当前节点的深度为其左右子树最大深度加1(加上当前节点自身)
  34.         return Math.max(leftDepth, rightDepth) + 1;
  35.     }
  36. }
复制代码
二叉树最小深度-Leetcode 111

   给定一个二叉树,找出其最小深度。
  最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
  说明:叶子节点是指没有子节点的节点。
  
  示例 1:
  

  1. <strong>输入:</strong>root = [3,9,20,null,null,15,7]
  2. <strong>输出:</strong>2
复制代码
示例 2:
  1. <strong>输入:</strong>root = [2,null,3,null,4,null,5,null,6]
  2. <strong>输出:</strong>5
复制代码

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;  // 节点的值
  5. *     TreeNode left;  // 左子节点
  6. *     TreeNode right;  // 右子节点
  7. *     TreeNode() {}  // 默认构造函数
  8. *     TreeNode(int val) { this.val = val; }  // 使用给定值初始化节点
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     /**
  18.      * 计算二叉树的最小深度。
  19.      * 最小深度是从根节点到最近的叶子节点的最短路径上的节点数。
  20.      *
  21.      * @param root 二叉树的根节点
  22.      * @return 返回二叉树的最小深度
  23.      */
  24.     public int minDepth(TreeNode root) {
  25.         // 如果当前节点为空,返回深度为0
  26.         if (root == null) {
  27.             return 0;
  28.         }
  29.         // 递归计算左子树的最小深度
  30.         int leftDepth = minDepth(root.left);
  31.         // 递归计算右子树的最小深度
  32.         int rightDepth = minDepth(root.right);
  33.         // 如果左子树或右子树有一个为空,则返回非空子树的深度加1
  34.         // 否则返回左右子树中较小的深度加1
  35.         if (leftDepth == 0 && rightDepth == 0) {
  36.             return 1; // 当前节点是叶子节点
  37.         } else if (leftDepth == 0) {
  38.             return rightDepth + 1;
  39.         } else if (rightDepth == 0) {
  40.             return leftDepth + 1;
  41.         } else {
  42.             return Math.min(leftDepth, rightDepth) + 1;
  43.         }
  44.     }
  45. }
复制代码
翻转二叉树-Leetcode 226

   给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
  
  示例 1:
  
  

  1. <strong>输入:</strong>root = [4,2,7,1,3,6,9]
  2. <strong>输出:</strong>[4,7,2,9,6,3,1]
复制代码
示例 2:
  
  

  1. <strong>输入:</strong>root = [2,1,3]
  2. <strong>输出:</strong>[2,3,1]
复制代码
示例 3:
  1. <strong>输入:</strong>root = []
  2. <strong>输出:</strong>[]
复制代码
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. *     int val;  // 节点的值
  5. *     TreeNode left;  // 左子节点
  6. *     TreeNode right;  // 右子节点
  7. *     TreeNode() {}  // 默认构造函数
  8. *     TreeNode(int val) { this.val = val; }  // 使用给定值初始化节点
  9. *     TreeNode(int val, TreeNode left, TreeNode right) {
  10. *         this.val = val;
  11. *         this.left = left;
  12. *         this.right = right;
  13. *     }
  14. * }
  15. */
  16. class Solution {
  17.     /**
  18.      * 翻转二叉树。
  19.      * 对于每个节点,交换其左子树和右子树。
  20.      *
  21.      * @param root 二叉树的根节点
  22.      * @return 返回翻转后的二叉树的根节点
  23.      */
  24.     public TreeNode invertTree(TreeNode root) {
  25.         // 如果当前节点为空,直接返回 null
  26.         if (root == null) {
  27.             return null;
  28.         }
  29.         // 递归翻转左子树
  30.         TreeNode left = invertTree(root.left);
  31.         // 递归翻转右子树
  32.         TreeNode right = invertTree(root.right);
  33.         // 交换当前节点的左子树和右子树
  34.         TreeNode temp = root.left;
  35.         root.left = root.right;
  36.         root.right = temp;
  37.         // 返回当前节点(翻转后的子树的根节点)
  38.         return root;
  39.     }
  40. }
复制代码

根据前序与中序遍历结果构造二叉树-Leetcode 105

   给定两个整数数组 preorder 和 inorder ,此中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
  
  示例 1:
  

  1. <strong>输入</strong><strong>:</strong> preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
  2. <strong>输出:</strong> [3,9,20,null,null,15,7]
复制代码
示例 2:
  1. <strong>输入:</strong> preorder = [-1], inorder = [-1]
  2. <strong>输出:</strong> [-1]
复制代码
  1. import java.util.Arrays;
  2. /**
  3. * Definition for a binary tree node.
  4. * public class TreeNode {
  5. *     int val;  // 节点的值
  6. *     TreeNode left;  // 左子节点
  7. *     TreeNode right;  // 右子节点
  8. *     TreeNode() {}  // 默认构造函数
  9. *     TreeNode(int val) { this.val = val; }  // 使用给定值初始化节点
  10. *     TreeNode(int val, TreeNode left, TreeNode right) {
  11. *         this.val = val;
  12. *         this.left = left;
  13. *         this.right = right;
  14. *     }
  15. * }
  16. */
  17. class Solution {
  18.     /**
  19.      * 根据前序遍历和中序遍历数组重建二叉树。
  20.      *
  21.      * @param preorder 前序遍历数组
  22.      * @param inorder 中序遍历数组
  23.      * @return 返回重建后的二叉树的根节点
  24.      */
  25.     public TreeNode buildTree(int[] preorder, int[] inorder) {
  26.         // 如果前序遍历数组为空,返回 null
  27.         if (preorder.length == 0) {
  28.             return null;
  29.         }
  30.         // 获取根节点的值(前序遍历的第一个元素)
  31.         int rootValue = preorder[0];
  32.         TreeNode root = new TreeNode(rootValue);
  33.         // 在中序遍历数组中找到根节点的位置
  34.         for (int i = 0; i < inorder.length; i++) {
  35.             if (inorder[i] == rootValue) {
  36.                 // 分割中序遍历数组为左子树和右子树部分
  37.                 int[] inLeft = Arrays.copyOfRange(inorder, 0, i);
  38.                 int[] inRight = Arrays.copyOfRange(inorder, i + 1, inorder.length);
  39.                 // 分割前序遍历数组为左子树和右子树部分
  40.                 int[] preLeft = Arrays.copyOfRange(preorder, 1, i + 1);
  41.                 int[] preRight = Arrays.copyOfRange(preorder, i + 1, inorder.length);
  42.                 // 递归构建左子树和右子树
  43.                 root.left = buildTree(preLeft, inLeft);
  44.                 root.right = buildTree(preRight, inRight);
  45.                 break;  // 找到根节点后跳出循环
  46.             }
  47.         }
  48.         // 返回重建后的根节点
  49.         return root;
  50.     }
  51. }
复制代码

根据中序与后序遍历结果构造二叉树-Leetcode 106

   给定两个整数数组 inorder 和 postorder ,此中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
  
  示例 1:
  

  1. <strong>输入:</strong>inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
  2. <strong>输出:</strong>[3,9,20,null,null,15,7]
复制代码
示例 2:
  1. <strong>输入:</strong>inorder = [-1], postorder = [-1]
  2. <strong>输出:</strong>[-1]
复制代码
  1. import java.util.Arrays;
  2. /**
  3. * Definition for a binary tree node.
  4. * public class TreeNode {
  5. *     int val;  // 节点的值
  6. *     TreeNode left;  // 左子节点
  7. *     TreeNode right;  // 右子节点
  8. *     TreeNode() {}  // 默认构造函数
  9. *     TreeNode(int val) { this.val = val; }  // 使用给定值初始化节点
  10. *     TreeNode(int val, TreeNode left, TreeNode right) {
  11. *         this.val = val;
  12. *         this.left = left;
  13. *         this.right = right;
  14. *     }
  15. * }
  16. */
  17. class Solution {
  18.     /**
  19.      * 根据中序遍历和后序遍历数组重建二叉树。
  20.      *
  21.      * @param inorder 中序遍历数组
  22.      * @param postorder 后序遍历数组
  23.      * @return 返回重建后的二叉树的根节点
  24.      */
  25.     public TreeNode buildTree(int[] inorder, int[] postorder) {
  26.         // 如果中序遍历数组为空,返回 null
  27.         if (inorder.length == 0) {
  28.             return null;
  29.         }
  30.         // 获取根节点的值(后序遍历的最后一个元素)
  31.         int rootValue = postorder[postorder.length - 1];
  32.         TreeNode root = new TreeNode(rootValue);
  33.         // 在中序遍历数组中找到根节点的位置
  34.         int rootIndexInInorder = -1;
  35.         for (int i = 0; i < inorder.length; i++) {
  36.             if (inorder[i] == rootValue) {
  37.                 rootIndexInInorder = i;
  38.                 break;
  39.             }
  40.         }
  41.         // 分割中序遍历数组为左子树和右子树部分
  42.         int[] inLeft = Arrays.copyOfRange(inorder, 0, rootIndexInInorder);
  43.         int[] inRight = Arrays.copyOfRange(inorder, rootIndexInInorder + 1, inorder.length);
  44.         // 分割后序遍历数组为左子树和右子树部分
  45.         int[] postLeft = Arrays.copyOfRange(postorder, 0, rootIndexInInorder);
  46.         int[] postRight = Arrays.copyOfRange(postorder, rootIndexInInorder, postorder.length - 1);
  47.         // 递归构建左子树和右子树
  48.         root.left = buildTree(inLeft, postLeft);
  49.         root.right = buildTree(inRight, postRight);
  50.         // 返回重建后的根节点
  51.         return root;
  52.     }
  53. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表