爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      数据结构之初始二叉树-二叉树的前序遍历

      首页 知识中心 数据库 文章详情页

      数据结构之初始二叉树-二叉树的前序遍历

      2025-02-11 09:38:28 阅读次数:13

      中序,二叉树,前序,示例,结点,节点,遍历

      二叉树的前序遍历

      题目:

      给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

       

      示例 1:

      数据结构之初始二叉树(4)

      输入:root = [1,null,2,3]
      输出:[1,2,3]
      

      示例 2:

      输入:root = []
      输出:[]
      

      示例 3:

      输入:root = [1]
      输出:[1]
      

      示例 4:

      数据结构之初始二叉树(4)

      输入:root = [1,2]
      输出:[1,2]
      

      示例 5:

      数据结构之初始二叉树(4)

      输入:root = [1,null,2]
      输出:[1,2]
      
      

      提示:

      • 树中节点数目在范围 [0, 100] 内
      • -100 <= Node.val <= 100

      这个题目如果用递归去做那就比较简单了,但是现在我们要采用非递归的方法来写。

      思路:利用栈,将遍历到的所有根结点都入栈(以前序遍历的路线去走) ,并且将这些节点都放入List当中。当遇到 null 时,就开始出栈顶的元素,并且以栈顶元素的 right 指针来重新遍历这棵树,直至栈为空即可。

      数据结构之初始二叉树(4)

      代码实现:

      class Solution {
          public List<Integer> preorderTraversal(TreeNode root) {
              List<Integer> list = new LinkedList<>();
              if (root == null) {
                  return list;
              }
              Stack<TreeNode> stack = new Stack<>();
              TreeNode cur = root;
              // 因为第一次时,这个循环进不来,所以就加了 cur != null 这个条件
              while (cur != null || !stack.isEmpty()) {
                  while (cur != null) {
                      // 根结点
                      stack.push(cur);
                      list.add(cur.val);
                      // 左子树
                      cur = cur.left;
                  }
                  TreeNode top = stack.pop();
                  // 右子树
                  cur = top.right;
              }
              return list;
          }
      }

      既然前序遍历的代码出来了,那么中序遍历和后序遍历也就可以搞定了。

      中序遍历:

      class Solution {
          public List<Integer> inorderTraversal(TreeNode root) {
              List<Integer> list = new LinkedList<>();
              if (root == null) {
                  return list;
              }
              Stack<TreeNode> stack = new Stack<>();
              TreeNode cur = root;
              while (cur != null || !stack.isEmpty()) {
                  while (cur != null) {
                      // 左子树
                      stack.push(cur);
                      cur = cur.left;
                  }
                  TreeNode top = stack.pop();
                  // 根结点
                  list.add(top.val);
                  // 右子树
                  cur = top.right;
              }
              return list;
          }
      }

      后序遍历:

      class Solution {
          public List<Integer> postorderTraversal(TreeNode root) {
              List<Integer> list = new LinkedList<>();
              if (root == null) { 
                  return list;
              }
              Stack<TreeNode> stack = new Stack<>();
              TreeNode cur = root;
              TreeNode prev = null; // 记录添加的前一个位置(防止死循环)
              while (cur != null || !stack.isEmpty()) {
                  while (cur != null) {
                      stack.push(cur);
                      cur = cur.left;
                  }
                  // 注意这里不能是pop,因为我们不能确定这个节点的右边是否还有节点
                  TreeNode top = stack.peek();
                  // 如果右边还有元素,那就得去遍历它;否则,就打印(左为null,右也为null)
                  if (top.right == null || top.right == prev) { // 右边被处理过才能进来
                      list.add(top.val);
                      prev = stack.pop(); // 更新为前一个位置的值 
                  } else {
                      cur = top.right;
                  }
              }
              return list;
          }
      }

       总结:其实只要我们知道遍历的顺序,从遍历顺序去解决,那么这种题目就迎刃而解了。

      二叉树的层序遍历

      题目:

      给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

       

      示例 1:

      数据结构之初始二叉树(4)

      输入:root = [3,9,20,null,null,15,7]
      输出:[[3],[9,20],[15,7]]
      

      示例 2:

      输入:root = [1]
      输出:[[1]]
      

      示例 3:

      输入:root = []
      输出:[]
      
      

      提示:

      • 树中节点数目在范围 [0, 2000] 内
      • -1000 <= Node.val <= 1000

      思路:通过队列来存储树中的节点,先储存根结点,再把根结点出队,判断左右子树是否为空,来使其入队。 

      数据结构之初始二叉树(4)

      代码实现:

      class Solution {
          public List<List<Integer>> levelOrder(TreeNode root) {
              List<List<Integer>> ret = new LinkedList<>();
              // 通过队列进行层序遍历
              if (root == null) {
                  return ret;
              }
              Queue<TreeNode> queue = new LinkedList<>();
              queue.offer(root);
              while (!queue.isEmpty()) {
                  List<Integer> list = new LinkedList<>();
                  // 记录每一层的个数
                  int size = queue.size();    
                  // 先把每一层的节点都放到list中
                  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);
                      }
                  }
                  // 再把每一层的list放到总的ret中
                  ret.add(list);
              }
              return ret;
          }
      }

      刚刚我们是从上往下遍历这棵树的,现在如果让我们从下往上遍历这棵树呢?

      二叉树的层序遍历 II

      题目:

      给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

       

      示例 1:

      数据结构之初始二叉树(4)

      输入:root = [3,9,20,null,null,15,7]
      输出:[[15,7],[9,20],[3]]
      

      示例 2:

      输入:root = [1]
      输出:[[1]]
      

      示例 3:

      输入:root = []
      输出:[]
      
      

      提示:

      • 树中节点数目在范围 [0, 2000] 内
      • -1000 <= Node.val <= 1000

      思路:从上往下我们已经知道了该怎么遍历,但是从下往上不知道该从何下手?这是我们就可以采用换汤不换药的方法了。即将从上到下的遍历结果储存起来,然后再交换两者的值即可。这样我们最终得到的值就是从下往上遍历的结果了。

      代码实现:

      class Solution {
          public List<List<Integer>> levelOrderBottom(TreeNode root) {
              List<List<Integer>> ret = new LinkedList<>();
              if (root == null) {
                  return ret;
              }
              Queue<TreeNode> queue = new LinkedList<>();
              queue.offer(root);
              while (!queue.isEmpty()) {
                  List<Integer> list = new LinkedList<>();
                  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);
                      }
                  }
                  ret.add(list);
              }
              // 现在ret中是按照从上往下的顺序存储的,我们需要的刚好相反,即需要交换
              swap(ret);
              return ret;
          }
      
          private void swap(List<List<Integer>> ret) {
              int left = 0;
              int right = ret.size()-1;
              while (left < right) {
                  // 交换
                  List<Integer> tmp = ret.get(left);
                  ret.set(left, ret.get(right));
                  ret.set(right, tmp);
                  left++;
                  right--;
              }
          }
      }

      还有一种实现方式:就是在插入时,我们不采用尾插的方式,采用头插的方式去构建LIst。

      // 采用头插的方式
      ret.addFirst(list);

      前序遍历、中序遍历、后续遍历的迭代版实现和层序遍历的实现所用的数据结构不同的原因:

      不管是前序遍历、中序遍历还是后序遍历,都是左子树的遍历顺序在前,右子树的遍历顺序在后,这就导致了一个问题:如果根结点找不到了(先打印了,就出队列了),那么怎么去找右子树呢?因此我们的需求就是把二叉树的根结点存储起来,即让其最后再出去。这个的效果就是先进后出——> 栈 ;而层序遍历就没有这样的需求了,即从上往下、从左往右依次遍历打印,那么我们打印完这一层的节点之后,就可以舍弃它们了。即先进先出——>队列。

      前面我们学习了给了前序和中序遍历或者后续和中序遍历,来构建二叉树,现在我们就用代码来实现一下: 

      从前序与中序遍历序列构造二叉树

      题目: 

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

       

      示例 1:

      数据结构之初始二叉树(4)

      输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
      输出: [3,9,20,null,null,15,7]
      

      示例 2:

      输入: preorder = [-1], inorder = [-1]
      输出: [-1]
      
      

      提示:

      • 1 <= preorder.length <= 3000
      • inorder.length == preorder.length
      • -3000 <= preorder[i], inorder[i] <= 3000
      • preorder 和 inorder 均 无重复 元素
      • inorder 均出现在 preorder
      • preorder 保证 为二叉树的前序遍历序列
      • inorder 保证 为二叉树的中序遍历序列

      思路:与我们做选填是一样的。通过前序遍历来确定二叉树的根结点,再通过根结点在中序遍历中的位置来确定左子树和右子树,而前序遍历往后,就是左子树的根结点,再确定在中序遍历中的位置来确定左子树的根结点的左子树和右子树。一直这样递归下去,直至左子树的下标大于右子树的下标(在中序遍历中) 。

      数据结构之初始二叉树(4)

      代码实现: 

      class Solution {
          // 创建一棵二叉树,先创建根结点,再创建左子树和右子树
          // 根结点就是根据前序遍历来找,
          // 左子树和右子树都是根据前序遍历和中序遍历来找出左子树和右子树的根结点
          private int rootIndex;
          public TreeNode buildTree(int[] preorder, int[] inorder) {
              
              return buildTreeChild(preorder, inorder, 0, inorder.length-1);
          }
      
          private TreeNode buildTreeChild(int[] preorder, int[] inorder, 
          int inorderbegin, int inorderend) {
              // 空树
              if (inorderbegin > inorderend) {
                  return null;
              }
              // 创建根结点
              TreeNode root = new TreeNode(preorder[rootIndex]);
              // 找到边界
              int border = findVal(inorder, preorder[rootIndex]);
              rootIndex++;
              // 创建左子树
              root.left = buildTreeChild(preorder, inorder, inorderbegin, border-1);
              // 创建右子树
              root.right = buildTreeChild(preorder, inorder, border+1, inorderend);
              return root;
          }
             
          // 找到根结点在中序遍历中的位置来划分左子树和右子树
          private int findVal(int[] inorder, int val) {
              for (int i = 0; i < inorder.length; i++) {
                  if (inorder[i] == val) {
                      return i;
                  }
              }
              return -1;
          }
      }

      前序学完了,还有后序:

      从中序与后序遍历序列构造二叉树

      思路:后序遍历同样是确定根结点的位置,从后序遍历数组的末尾开始遍历根节点,在中序遍历中寻找到根结点的位置并划分左右子树。与上述思路类似。

      注意:后序遍历是:左子树 右子树 根;而前序遍历是:根 左子树 右子树 。这也就意味着前序遍历找到的根是左子树的根(除祖先节点外) ,即我们先得创建左子树;而后序遍历找到的根是右子树的根(除祖先节点外),即我们先得创建右子树。因为创建二叉树其实就是依赖于根结点,谁于根结点临近创建谁。

      class Solution {
          // 后续遍历找到根结点,再根据根结点确定左子树和右子树
          private int rootIndex;
          public TreeNode buildTree(int[] inorder, int[] postorder) {
              rootIndex = postorder.length-1;
              return buildTreeChild(inorder, postorder, 0, inorder.length-1);
          }
      
          private TreeNode buildTreeChild(int[] inorder, int[] postorder,
          int inorderbegin, int inorderend) {
              if (inorderbegin > inorderend) {
                  return null;
              }
              TreeNode root = new TreeNode(postorder[rootIndex]);
              // 在中序遍历的数组中找到根结点的位置
              int border = findVal(inorder, postorder[rootIndex]);
              rootIndex--;
              root.right = buildTreeChild(inorder, postorder, border+1, inorderend);
              root.left = buildTreeChild(inorder, postorder, inorderbegin, border-1);
              return root;
          }
      
          private int findVal(int[] inorder, int val) {
              for (int i = 0; i < inorder.length; i++) {
                  if (inorder[i] == val) {
                      return i;
                  }
              }
              return -1;
          }
      }

      二叉树的最近公共祖先

      题目: 

      给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

      百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

       

      示例 1:

      数据结构之初始二叉树(4)

      输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
      输出:3
      解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

      示例 2:

      数据结构之初始二叉树(4)

      输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
      输出:5
      解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

      示例 3:

      输入:root = [1,2], p = 1, q = 2
      输出:1
      
      

      提示:

      • 树中节点数目在范围 [2, 105] 内。
      • -109 <= Node.val <= 109
      • 所有 Node.val 互不相同 。
      • p != q
      • p 和 q 均存在于给定的二叉树中。

      思路一:采用穷举的方法,看看会出现几种情况。

      数据结构之初始二叉树(4)

      上面三种情况其实就是通过示例总结出来的 

       代码实现:

      class Solution {
          public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
              // 在递归去寻找的过程中可能会出现下面两种情况(限制条件)
              if (root == null) {
                  return null;
              }
              if (root == q || root == p) {
                  return root;
              }
              // 走到这里说明根结点一定不存在,则判断左子树和右子树即可
              // 遍历左子树
              TreeNode leftTree = lowestCommonAncestor(root.left, p, q);
              // 遍历右子树
              TreeNode rightTree = lowestCommonAncestor(root.right, p, q);
              // 再遍历完成之后,我们就来判断是哪种情况
              if (leftTree != null && rightTree != null) {
                  return root;
              }
              if (leftTree != null && rightTree == null) {
                  return leftTree;
              }
              // 下面的代码可以简化为 return rightTree;
              if (leftTree == null && rightTree != null) {
                  return rightTree;
              }
              return null;
          }
      }

      如果我们总结不出来,也没关系。还有另外一种方法,就是把p和q出现的路线储存起来,然后再去一 一比较,遇到第一个相等的就是公共的祖先。

      首先,得确定是用什么数据结构来储存路线。栈 还是 队列呢?其实都是可以的。因为我们采用的是从上往下遍历,那么根结点一定是最先被放入栈(队列)中的。而我们比较的方式不同,就导致了储存的方式不同。如果我们是想找不同,那就得用队列,从根结点开始比较;如果我们是想找相同,那就得用栈,从p和q开始比较,找到相同的节点。

      栈的实现方式:

      class Solution {
          public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
              Stack<TreeNode> stackP = new Stack<>();
              Stack<TreeNode> stackQ = new Stack<>();
              getPath(root, p, stackP);
              getPath(root, q, stackQ);
              // 先让长的走差值步数
              if (stackP.size() > stackQ.size()) {
                  int size = stackP.size() - stackQ.size();
                  while (size-- > 0) {
                      stackP.pop();
                  }
              } else {
                  int size = stackQ.size() - stackP.size();
                  while (size-- > 0) {
                      stackQ.pop();
                  }
              }
              // 开始一起出
              while (stackQ.peek() != stackP.peek()) {
                  stackQ.pop();
                  stackP.pop();
              }
              return stackQ.peek();
          }
      
          private TreeNode getPath(TreeNode root, TreeNode target, Stack<TreeNode> stack) {
              if (root == null) {
                  return null;
              }
              stack.push(root); // 先得把这个入栈
              if (root == target) {
                  return root;
              }
              // 左子树
              TreeNode leftTree = getPath(root.left, target, stack);
              if (leftTree != null) { // 左子树不为null,说明在左子树找到了,即返回
                  return leftTree;
              }
              // 右子树
              TreeNode rightTree = getPath(root.right, target, stack);
              if (rightTree != null) { // 右子树不为null,说明在右子树找到了,即返回
                  return rightTree;
              }
              // 左右子树的遍历结果都是null,即都没找到,就出栈
              if (leftTree == null && rightTree == null) {
                  stack.pop();
              }
              return null;
          }
      }

      在用队列去写时,我们就会发现一个问题:如果左右子树都为null,那么证明这个节点不是我们路径上的节点,就得出队,但是队列的数据是先进先出的特点,不满足我们的要求,即普通队列是不行的。因此,就只能用栈。

      我们在分析问题时,可能刚刚不会遇到这点,但是后面在做题时,体会到了这点就行,不管是什么思路,我们都得上手去写才可以。

      根据二叉树创建字符串

      题目:

      给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

      空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

       

      示例 1:

       

      数据结构之初始二叉树(4)

      输入:root = [1,2,3,4]
      输出:"1(2(4))(3)"
      解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。
      

      示例 2:

       

      数据结构之初始二叉树(4)

      输入:root = [1,2,3,null,4]
      输出:"1(2()(4))(3)"
      解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。
      

      提示:

      • 树中节点的数目范围是 [1, 104]
      • -1000 <= Node.val <= 1000

      思路:根据示例,我们就可以看出:遇到左子树就得添加“(”,当左子树走完,就得添加“)”,当左子树为null,并且右子树不为null时,得添加“()”。 

      代码实现:

      class Solution {
          // 通过 StringBuild 来构建字符串
          private StringBuilder sb = new StringBuilder();
          public String tree2str(TreeNode root) {
              dfs(root);
              return sb.toString();
          }
          
          private void dfs(TreeNode root) {
              if (root == null) {
                  return;
              }
              // 根结点
              sb.append(root.val);
              // 根的左子树
              if (root.left != null) {
                  sb.append("(");
                  // 继续递归去左子树寻找
                  dfs(root.left);
                  // 左子树走完了得加右括号
                  sb.append(")");
              } else {
                  if (root.right != null) {
                      // 左边添加一对空括号
                      sb.append("()");
                  } else {
                      return;
                  }
              }
              // 根的右子树
              if (root.right != null) {
                  sb.append("(");
                  dfs(root.right);
                  sb.append(")");
              } else {
                  return;
              }
          }
      }

      总结:通过上面几题的练习,我们不难发现其实有的题目需要我们去利用示例的规律来写,但更多的题目是需要我们对数据结构进行不断的学习和熟练,这样才能更加得心应手。 

      好啦!本期 数据结构之初始二叉树(4)的学习之旅就到此结束啦!二叉树的折磨也是暂时的结束啦!即将开启新的数据结构之旅!我们下一期再一起学习吧!

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/2301_80854132/article/details/140593188,作者:我要学编程(ಥ_ಥ),版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:数据结构之顺序表的相关知识点及应用

      下一篇:scanf与printf函数的详细介绍及其用法

      相关文章

      2025-05-19 09:05:01

      【手把手带你刷好题】—— 60.第N个泰波那契数(记忆化搜索、简单DP)

      【手把手带你刷好题】—— 60.第N个泰波那契数(记忆化搜索、简单DP)

      2025-05-19 09:05:01
      打卡 , 示例
      2025-05-19 09:05:01

      【手把手带你刷好题】—— 63.杨辉三角(递推)

      【手把手带你刷好题】—— 63.杨辉三角(递推)

      2025-05-19 09:05:01
      打卡 , 杨辉三角 , 示例
      2025-05-19 09:04:44

      spark控制台没显示其他机器

      spark控制台没显示其他机器

      2025-05-19 09:04:44
      Spark , 节点 , 集群
      2025-05-19 09:04:44

      js原生写一个小小轮播案例

      js原生写一个小小轮播案例

      2025-05-19 09:04:44
      js , 示例
      2025-05-19 09:04:22

      如何向ChatGPT提问,才能获取高质量的答案

      如何向ChatGPT提问,才能获取高质量的答案

      2025-05-19 09:04:22
      ChatGPT , Flask , 示例 , 认证
      2025-05-19 09:04:14

      二叉树经典OJ练习

      二叉树经典OJ练习

      2025-05-19 09:04:14
      root , 二叉树 , 子树 , 节点 , 遍历
      2025-05-19 09:04:14

      《剑指Offer》按之字形顺序打印二叉树——最容易理解的思路,两分钟学会~

      《剑指Offer》按之字形顺序打印二叉树——最容易理解的思路,两分钟学会~

      2025-05-19 09:04:14
      二叉树 , 数据结构
      2025-05-19 09:04:14

      《剑指Offer》二叉搜索树的第k个节点——真没你想象中那么难,一招教你秒杀它~

      《剑指Offer》二叉搜索树的第k个节点——真没你想象中那么难,一招教你秒杀它~

      2025-05-19 09:04:14
      二叉树 , 数据结构
      2025-05-16 09:15:24

      Redis Set集合

      Redis Set集合

      2025-05-16 09:15:24
      set , 个数 , 元素 , 示例 , 集合
      2025-05-16 09:15:24

      jQuery遍历对象、数组、集合

      jQuery遍历对象、数组、集合

      2025-05-16 09:15:24
      jQuery , 对象 , 数组 , 遍历 , 集合
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5251569

      查看更多

      最新文章

      《剑指Offer》按之字形顺序打印二叉树——最容易理解的思路,两分钟学会~

      2025-05-19 09:04:14

      《剑指Offer》二叉搜索树的第k个节点——真没你想象中那么难,一招教你秒杀它~

      2025-05-19 09:04:14

      【MySQL】-数据库优化(索引)

      2025-05-14 10:03:13

      30天拿下Rust之结构体

      2025-05-14 10:02:58

      python向IP地址发送字符串

      2025-05-14 09:51:21

      mysql数据库中decimal数据类型比较大小

      2025-05-14 09:51:21

      查看更多

      热门文章

      #yyds干货盘点# mysql常见面试问题

      2022-12-26 09:32:17

      python学习(7)——遍历列表、切片及元组

      2023-05-22 03:24:42

      PostgreSQL递归查询

      2023-06-19 06:57:10

      【数据结构】二叉树基础OJ题

      2023-07-26 08:11:39

      【数据结构】二叉树与堆

      2023-07-26 08:09:37

      数据结构之二叉搜索树(BST)

      2023-07-20 06:06:54

      查看更多

      热门标签

      数据库 mysql 字符串 数据结构 MySQL 算法 redis oracle java sql python 数据 索引 SQL 查询
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      LeetCode:18. 四数之和

      【数据结构】树、二叉树与堆(长期维护)

      for...in、for...of和其他循环的区别

      【Oracle11g SQL详解】GROUP BY 和 HAVING 子句:分组与过滤

      【数据结构】二叉树与堆

      大话数据结构--线性表

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号